Skip navigation.

exploreopera

| Help

Sign up | Help

There is no spoon

It is not the spoon that bends, it is only yourself

Posts tagged with "quality"

Blog Focus and Target Audience

, ,

After looking at my blog for the last weeks, I realized that I like most of the entries. I am particularly proud of some of them (e.g. The essential difficulty of software development).

I have also realized that it covers the same topics like many other blogs; for example Martin Fowler's or Jeff Atwood's. Those are the people who understood that human factor is extremely important in software development and have stated once and again the same principles and practices that I did. Though repetition is important – maybe people will learn if they see the same things repeated in different contexts, by different people, on different sites – I'm not sure that I can do a better job than the people I nominated.

There's also the fact that the MyOpera community is limited. It's a great community, it's vibrant, the people that participate to it are more interesting than in most other communities, and I really like it. From the technical point of view, it has almost everything you might wish for, including an amazingly effective SEO (the number of views on my blog are much higher than I expected and than I would have been able to do on my own). The only drawback for me is that most of the members of the community are not from my natural target audience: technical persons from European countries or from U.S.

I am thus faced with a couple of issues I need to solve:
  • to change the focus of my blog
  • to find ways to reach my target audience

Regarding the first point, I will make a few changes. I believe that the most interesting part of any training, book or blog is the personal experience of the trainer or writer. I will put more of my experience on the line. There's a lot to tell, since I grew with the Romanian IT industry starting from the point where there was no project manager until I took part in the CMMI level 3 effort for appraisal and then started to work seriously with agile methodologies, since I worked abroad (in France, UK, Switzerland, Belgium) and in more than five different industries (notably printing, banking, advertising, energy), with different technologies. I've held different roles in the teams, including software developer, business analyst, technical lead, project manager, software architect and consultant.
The second change is that I will write less often but with more research. There's no point in restating the same things again and again, while letting the readers make their own research. The main point of this revamp is that I want to provide added value to my readers. I like a lot how Joel Spolsky writes his posts, but it will take some time for me to get there.

To the second point. Since I don't want to leave the MyOpera community, I have a few possibilities: publish my blog in multiple places on the web (which may prove difficult), to market my blog to my target audience(no idea how) or to create a technical-related group on MyOpera (if it doesn't exist yet – group search is rather cumbersome in MyOpera). I'm yet undecided, and any piece of advice is welcome.

With these being said, stay tuned for the next developments of There is no spoon! New posts are already in the pre-production phase and will be published in a few days.


Personal advertisement: I am PassionIT and I help teams develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help. Alexandru Bolboaca-Diaconu
Add to Technorati Favorites  Digg!

Blog revamp

, ,

I have reached the conclusion that I am not happy with the average quality of my posts. There are some which I like, but there are many which feel incomplete, for which more polishing time would have been needed. (Feel free to contradict me here ;-)

Therefore I am setting myself a two weeks deadline for improving my blogging. Changes will happen in my blog during this time, but I won't add new posts as often as until now.

I want to have at the end of the two weeks the following things:
  • Old posts that are good, in my view, will be refined and republished (version 2)
  • A way of working that would allow me to keep my blog quality consistent


For the second objective, I expect a few changes to happen, namely I expect to post less often and to do more research and polishing before publishing.

I don't really think that metablogging is interesting to readers, but since my main activity in the following weeks will be to improve my blog, I will probably post about it.

Well, that's it; talk to you soon, and hopefully, better!

The Tester

, , , ...

The Tester is one of the most important member of a software development team. Unfortunately, in many projects I've worked, his/her role was severely underestimated, resulting in low product quality and high costs.

I believe this happens because testing is a more difficult task than the common sense tells us. Testing software is hard because it hits the same essential difficulty as all other activities in software development: software is constructed from ideas. It's even worse for a tester, because how can one check that the representation of an idea corresponds to the idea?

Because of this fact, a tester has to have a few key skills:
  • Smart, in order to understand the problem
  • Attention to details, in order to be able to find even the issues burried deep in the functionality and in order to be able to fill the missing details from the functional requirements (there always are)
  • Rigour, because he has to follow a process that allows him to check all functionalities, to recheck them periodically, to fill in the missing pieces and to improve the process
  • Empathy, because he needs to understand the users
  • Effective communicator, because he has to communicate both in writing (through test documents, bug reports etc.) and in speaking (with the developers, the business analyst, the project manager etc.)


If we add to those skills things like automatic testing, managing virtual machines and virtual networks, testing for security, stress testing and, the cream on the top, writing unit tests, we understand that a tester is a really complex character.

And a really important one, too. He has to work side by side with the development team right from the start of the project, because of simple economical reasons: studies have shown that bugs caught earlier are much less expensive than bugs caught late. Even a week difference between the moment when the bug is found may translate in a significant increase in costs: the developer locates the bug in a longer time, it's more difficult to fix it, it has to be re-tested and so on.

Therefore, if you want quality in your project, use a good tester and use him/her early. The price you pay for testing will be an investment, not an expense.


Personal advertisement: I am PassionIT and I help teams develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help. Alexandru Bolboaca-Diaconu
Add to Technorati Favorites  Digg!

Are today's organizations creating hardworking idiots?

, , , ...

This is the name of an article I found today. It's even more interesting when I contrast it with Funky Business and Karaoke Capitalism.

When will businesses learn that ideas are more important than routine?


Personal advertisement: I am PassionIT and I help teams develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help. Alexandru Bolboaca-Diaconu
Add to Technorati Favorites  Digg!

Advice for the passionate and young software developers

, , , ...

I have gathered some advice for young and passionate software developers. It comes mainly from my experience and from my peers'. I hope it helps.

1. Be aware that programming is hard

Despite what Microsoft, Sun and other software development tools vendors want you to think, programming is hard. It looks easy though. Start an IDE, run a wizard, do some work in a designer, drag and drop database tables, automatically generate code and everything seems to work just fine.
Well, in 99% of the cases, it won't. Something will happen that will make your application fail, and because you used an IDE, a wizard, a designer and because you don't know what's going on in the backstage, you're in trouble.

2. You're not done when you've stopped writing the code

You get a task from your project manager, write the code, compile and run the application once to see if it's working. If it's working, it means that you're done.
No, you're not. You need to test it thoroughly before you're actually done. Yes, there is a tester in the team, but bugs caught early are much less expensive than those caught in the testing phase. The project manager will insist on this topic.

3. A programming job means continuous learning

The only constant in our lives is change. You feel this even more in IT. New hardware, new software, new programming languages, new tools come up every year. There are good news however: the basic principles haven't changed in 25 years. Understand them and you will be less surprised. The bad news is that it takes time to understand them.

4. The technology used is not essential

C# is good. Java is good. Perl is good. Python is good. Hell, even Cobol is good. (Only VB and old ASP are evil :-D.) Each of them for their own domain. Learn them all. The more languages you learn the easier will be to learn more, and you will find innovative and effective solutions for your projects.


5. Solve the problem

Be pragmatic. You work for a project because somebody has a problem and they want it fixed. Find the best way to solve it. Yes, there are limitations. Yes, you can't always use the ideal solution. This is why you are asked to solve the problem and not a computer. There are no recipes. You have the capability to adapt to the situation. Solving the problem is the fun part, too.

I hope that helps!


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!

Defining an error management policy

, , , ...

This week I managed to define the first logical and robust error management policy from my 8 years career. It may sound like I haven't tried before, and it's not true.

The truth is that the right error management policy is very difficult to define.

The error that I did before was to underestimate the time needed for such a policy, and not to think of a method for it. I finally got smarter, and first tried to define such a method. That's what this blog entry is about ;-).

I realized, with some help, a simple fact:

The errors that may appear in software derive from the disruption of data flows and use cases.

So, here's the method:

  1. Take a module of the application
  2. Define the data flows
  3. Define the use cases
  4. Brainstorm on the errors that may appear
  5. Categorize the errors
  6. Define a method to treat each category
  7. Review and incrementally improve the policy

We notice here a few things.

First, error management is not generic, but is tailored for the needs of each module and/or application. There are fundamental differences between distributed systems, desktop applications, mobile applications and so on, even if we don't take into account the differences in technology.

Second, exceptions are not mentioned in the method. Even if modern languages use exceptions for error management, exceptions are not fit for all cases. If you are throwing exceptions over the boundary of a Web Service, for example, then you could get in trouble. (Been there, done that). Sometimes it's better to use error codes or compensation instead of exceptions.

Third, the response to an error deoends on the context. Valid responses are:
  • Do nothing
  • Compensate and retry
  • Retry
  • Notify the user


When choosing the appropriate response, non-functional requirements play an important role. For example, what is more important for a web service: to retry in case of an error or to reply immediately saying that an error occured? Well, it depends on the specified response time: is it more important to answer quickly or to give back results? This kind of questions is application specific.

So, to summarize, what did I find out about error management policies?
  1. They are NOT easy to define
  2. They depend on the context (application, module, non-functional requirements etc.)
  3. Exceptions are NOT the ultimate answer


You also have a tried and tested method for defining exception handling policies. If you find this useful, I would like to know ;-).


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!

3 Hidden Costs in Software Projects

, , , ...

One of the core reasons for which software project fail is that managers and/or customers don't know the hidden costs of software development. Here are three of them.

Hidden cost #1: Unneeded complexity

Complexity is the enemy of a software project. Not only it undermines the productivity when developing the "too complex" feature, it also undermines the productivity of developing related features, of debugging, and of fixing issues. It undermines the moral of the team, produces headaches for developers and managers, and can also result in loss of personnel.

Complexity is fought with a variety of means, but all seem costly to an untrained eye: using good developers, good design, design reviews, code reviews, refactoring.

When complexity is well kept under control, the final costs of the project go way down. First of all, developers are happier, they are working better and get better results. Second of all, managers don't have to fight with them to get them motivated.


Hidden cost #2: Security

Only recently security has become a major ocupation for the commercial software developers. This only happened because of painful experiences and because it became clear that not taking security into account results in major losses.

Security is difficult to implement in a software. The only way is to use a holistic approach, to think of it right from the start and all throughout the process. It also implies additional development costs: training the developers on security issues, continuously monitor the code from a security perspective, implement specific security-related mechanisms that wouldn't be needed for an application deployed in the void.

Hidden cost #3: Choosing cheap but bad developers over good but expensive ones

Choosing cheap developers seems a very good financial decision. But there's a catch.

Good developers are often 10 times more productive than bad developers, and they are never paid 10 times more. On the other hand, if a team is formed of a lot of good developers, other will want to join it. If a team has only a few bad developers, either the bad developers or the good developers need to leave.

I've seen projects where good developers were fixing during the night what bad developers were implementing during the day, and they were not always paid for it. This is one reason for which this cost doesn't reach the financial balance. So, stop doing it!

So there you are: 3 hidden costs in software projects.

UPDATE: Martin Fowler talks about this third hidden cost in his blog.


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!

Entropy in software development

, , , ...

Quite often I hear developers or managers acting very surprised about the fact that an application "doesn't work".

I am never surprised when an application doesn't work. Probably because of my engineering background, and probably because I can still remember the second law of thermodynamics:

The entropy (=randomness, disorder) of an isolated system which is not in equilibrium will tend to increase over time, approaching a maximum value at equilibrium.

This law states something that we all know intuitively: it takes effort to move things in the desired direction. It doesn't matter whether we're talking about a carpenter trying to build furniture, a cleaning person trying to keep a room clean or a software developer trying to develop an application.

This means that the normal state of things is for an application not to work according to specifications. That's part of the reason why programming is hard: you have to fight entropy.

The reason why people are surprised with an application that doesn't work is that they don't realize just how hard it is to fight entropy in a software project, avoiding in the same time the other big enemy: complexity. Many people don't understand that programming actually means working with ideas.

What comes as a natural consequence of the above law is that I am always nervous when an application we develop seems to work fine. That's just not natural.
When I say "seems to work fine", I mean that there is no reasonable proof of the fact that the application is working fine. Of course, we can't prove that an application just works (no matter what marketing tries to tell us). But there are many examples of projects that were driven back because they lacked this proof and because they discovered at some point that inside the seemingly good working box there were many lurking bugs.

The first rule that results from this reasoning is:

Never trust your developers when they say the application is working fine.

Only trust them when they prove it to you with: unit testing, functional testing, beta testing (with real users) etc. Developers' mindset is about making the program work, not making it fail. That's why not many of them are good at testing their own modules.

In the end, remember that it's normal for an application not to work. It's unnatural when the people working on it say that it works without investing too much effort into it. The entropy is hard to beat.


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!

The essential difficulty of software development...

, , , ...

... is that we are working with ideas, not with material items.

The relation between people and ideas is fundamentally different from the relation between people and material items. For one thing, material items are perceived in the same way by different people (unless some of the participants are under the influence of some perception-altering substances). Material items can be described completely by diagrams and numbers.

The IT industry has gone to a great length of defining ways that would allow completely describing ideas. We have UML diagrams, templates for writing technical documentation and so on. We have ways to describe data and the transformation it suffers. We also have ways to describe the user interface.

The problem with the description methods we're using to describe ideas in IT is that:
  • It's really difficult and time consuming to completely describe an idea (try to read Kant or Hegel to realize how difficult it is)
  • Different people understand the description differently
  • It's difficult for people to understand the description completely, to take into account all the details

Besides this, ideas evolve, and the people who need the application expect them to be easily included in the implementation. It's very difficult to dissociate an idea from its programmatic representation. Ideas are easy to modify; the implementation is itself immaterial; so why is the implementation so much difficult to change than the idea itself?

In order to prevent misunderstandings from happening, we are testing the "materialization" of the ideas; in other words, the implementation. But how do you test an idea? It's not a matter of fitting a mechanical piece in a mechanism. It's about comparing the mental image of the idea with the actual implementation. But you can't actually touch it, move it, look at it from all angles; at least not physically.

And then, there's the relation between users and their applications. The computer is different from any other tool known to man because of a few key characteristics:
  • It processes information and the result is information
  • It gives good results only when given good input
  • It gives wrong results in any other situation
  • The user cannot touch an application

Therefore, the user has to form a mental model of the application and of how it works. So we are back to the same problem of perception of ideas. The user's mental model about the application is not bound to be the same as the one of the developer, of the producer and so on.

This essential difficulty is responsible for the most problems we face in software development. And, because it's an essential difficulty, there are no ways to avoid it, only to alleviate its effects.


The first solution that comes into mind is to minimize the communication chain. If the mental model gets more corrupted the more it travels then make it travel less.

Open source is a succesful model because the people writing the software are the same people who need it, and they can take decisions regarding it. In other words, they are bound to have a similar mental model because they need the same thing, and they are free to adapt the ideas.

Agile methodologies are succesful because the communication chain is the shortest possible. The customer is part of the team and he is the one explaining the mental model directly to the people responsible with materializing it.

All the other methodologies have proven in time to be impractical. Completely documenting an application in UML is less productive than writing the application and adapting it as it goes. In fact, completely defining an application means that we are creating a complete representation of the application in another language, and isn't that exactly what programming does? Except that you can run a program and you can, with some extent, use your senses with a program. That's impossible with another abstract representation of the same idea.

The other way to alleviate the difficulty is to use the right people for the job. Since defining a mental model for the application is a human problem, it's dependent on the individual. People with the right mindsets and with a certain mental agility that allows them to adapt to exotic mental models manage to form a mental image that's much closer to the one that's transmitted to them. And, with experience, they come to the point where the fill in the missing parts with the correct pieces of the puzzle (for a very interesting discussion on the expert mind, see this article).

To summarize, if you want your software project to be succesful, do the following:
  • Minimize the communication chain between the vision and the implementer
  • Use the right people in your team


I believe this to be the basis for any succesful software project.


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!

5 things managers don't get about software development

, , , ...

1. Software development is creative work

How do we know that's true: All rules that apply to creative work are known to give results for software development. For example: write the program, then re-write it at least once (see [1], [2]).

How do we know managers don't get it: The cubicle. The noise. Any other environmental factors that kill creativity.


2. Managing an IT project is different than managing projects in other domains

"In many ways, managing a large computer programming project is like managing any other large undertaking — in more ways than most programmers believe. But in many other ways it is different - in more ways than most professional managers expect."
(from [1])

How do we know that's true: Practices that work in other industries don't work in software development (for example adding more people to a project to make it end faster or motivating people with "the employee of the month" program)

How do we know managers don't get it: They still think people are interchangeable in a project team and they still use ineffective motivation and recruiting techniques.

3. People are more important than processes

How do we know that's true: No software company has succedeed only based on processes. Instead, all software companies that are very succesfull have very good people. The best example is Google.

How do we know managers don't get it: They still insist on the work processes instead of attracting talented people and instead of making sure that they reject the wrong people. (See [3] for an interesting story regarding this issue).

4. Good developers are cheaper than bad developers

How do we know that's true: Data from the industry shows that good developers can be up to 10 times more productive than bad developers (see [1]). From my own experience, there are cases when bad developers can be even worse than that. But good developers are never paid 10 times more than bad developers.

How do we know managers don't get it: They prefer to hire cheap but mediocre developers instead of hiring talented people.

5. No bad developer has ever become a good developer

How do we know that's true: Even Bill Gates said it. There are studies about it (see [5]).

How do we know managers don't get it: They still hope that bad but cheap developers will learn in time.

References:

[1] Frederick Brooks, "The mythical man month"
[2] Eric S. Raymond, "The art of Unix programming"
[3] Paul Graham, http://www.paulgraham.com/colleges.html
[4] Joel Spolsky about recruiting software engineers: http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html
[5] Saeed Dehnadi, Richard Bornat, Research Study about Programmer Aptitudes, http://www.cs.mdx.ac.uk/research/PhDArea/saeed/


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!