How Hard Could It Be? Five Easy Ways to Fail

Pedro da Ros has pointed me an interesting article from Joel Spolsky about ways software projects go wrong. Five Easy Ways to Fail shows us five step-guide to ensure software failure:

  1. Mistake No. 1: Start with a mediocre team of developers
  2. Mistake No. 2: Set weekly milestones
  3. Mistake No. 3: Negotiate the deadline
  4. Mistake No. 4: Divide tasks equitably
  5. Mistake No. 5: Work till midnight.</li

Have you ever been in any situation like those above?

Tags: ,

Reducing the distance between programming and project management

Some days ago me and [info]bpfurtado were talking about different areas of interest on software development and the distance created by programmers in not involving themselves on another interesting (for me :-)) areas, such as process management, requirement analysis, change control processes, etcetera.
Programmers tend to create a barrier between their tasks and other areas on software development, they prefer to be more specialist. Most of them don’t like to participate on requirement analysis discussions, design sessions, development of test cases. They prefer to code instead of being involved on such activities.
When you work on a software development company, you must have interest at the *big thing*, you need to have the whole vision of your area. People around will put better eyes on you, if you show these interest.
Nowadays at my company I’m participating in activies like use case requirement analysis and programming, because I wanna be involved in the best of both worlds. I wanna increase my analysis and programming skills. It was my decision to participate part time on requirement analysis and the rest on programming activities. I think it’s very important to have this vision and consequently it makes you a better professional. And you? Dou you like to be involved not only in programming tasks?

Tags: , ,

Changing Firefox profile location on Win

Some days ago I finally had enough time to move all my Documents and Settings folder to a dedicated partition, storing my Home directory and files (I already know it’s very late for this…don’t have to remember me..). So, I was looking for a way to change the Firefox default profile location to this partition, keeping it safely separated from the installation files. It’s quite easy, the steps are as follws:

  • In Windows 2000 and XP, you should find your profile in: C:\Documents and Settings\{user name}\Application Data\Mozilla\Firefox\Profiles. The Application Data folder is by default a hidden folder in Windows, so if you do not see an Application Data folder, check the Folder Options and make sure the option “Show hidden files and folders” is checked.
  • Open the profiles.ini file, on the Profiles folder. Open it. Do not use Word or a word processor because these programs typically save weird characters when they save a file. You need to use a pure text editor like Notepad++.
  • You have to make two changes to the profiles.ini file. First, change IsRelative=1 to IsRelative=0. This changes the path from relative to absolute. Second, fully specify the new path to the new location of the Profiles folder and the default file folder. The new contents of the file seems like this one:

    [General]
    StartWithLastProfile=1

    [Profile0]
    Name=default
    IsRelative=0
    Path=E:\Rafael\firefox_profile\profile.default

  • If you have any extensions, you have to open the extensions.ini file on your new profile directory (in this case, E:\Rafael\firefox_profile\profile.default) and replace any reference to the older directory to the new one. My new extensions.ini file looks like this:

    [ExtensionDirs]
    Extension0=E:\Rafael\firefox_profile\profile.default\extensions\{34274bf4-1d97-a289-e984-17e546307e4f}
    Extension1=E:\Rafael\firefox_profile\profile.default\extensions\{6AC85730-7D0F-4de0-B3FA-21142DD85326}
    .
    .
    .
    [ThemeDirs]
    Extension0=C:\Program Files\Mozilla Firefox\extensions\{972ce4c6-7e08-4474-a285-3208198ce6fd}
    Extension1=E:\Rafael\firefox_profile\profile.default\extensions\{eb46c787-131a-4eb7-9b93-7f62ca550917}

So I think this should works. Save those files and restart Firefox. Soon I will make these changes on my Linux kubuntu distro!

Tags: ,

Why not design patterns?

Some months ago, Cedric has reported people criticizing the use of design patterns on software projects, with some arguments like:

  • “it’s a sign that your language is fundamentally broken”
  • “focus on simpler solutions before going straight to a complex recipe of design patterns”

and other funny things also. Moreover, some said design patterns was inspired in Cristopher Alexander’s Pattern Language book, although design patterns leverage complexity to the programming languages, totally opposed to the Alexander’s book simplicity proposal. As Cedric said, people do criticize, but not provide better solutions. It’s inside our personality: we often try to find defects in all the ways people realize things, but we don’t like to search for better ways to realize the same things. In my opinion, design patterns are:

  • Patterns for developing object-oriented reusable software;
  • Leverage a solution to a general design problem in a particular context;
  • Promotes design reuse;
  • Promotes a common vocabulary on the software development team;
  • Facilitate software modifications, documentation;
  • Promotes manutenable, understandable, legible code, abstracting aspects of a domain problem;

and some other benefits…

So, what do people want? Every time, every software project implementing the same feature in a different way? Of course we’re not saying here to insulate a lot of patterns in a sofware project, but, come on, why not establish a common vocabulary of software instead of doing things all diferent every time? Why reinventing the wheel?

Tags: , ,

See-Through Mobile Devices

Check out this interesting video about LucidTouch see-through mobile device. See-Through Mobile Devices let users see their hands while touching behind the display. Very nice.

Tags: , ,

About use case reuse

Here are some good idioms by Scott Ambler on use case reuse. Must read.
I’m trying to keep this blog up to date, but it’s being very difficult…

Tags: ,

Thinking Iterative, but doing Waterfall development

Some companies think they’re applying iterative and incremental development, but in practice are doing waterfall development. Here are some tips described in Applying UML and Patterns, by Craig Larman, which can help you discover if your company doesn’t understand the Unified Process and iterative development (these tips can clarify all stakeholders misunderstanding about the difference of the two approaches):

  1. You think that inception = requirements, elaboration = design, and construction = implementation (that is, superimposing a waterfall lifecycle onto the UP).
  2. You think that the purpose of elaboration is to fully and carefully define models, which are translated into code during construction.
  3. You try to define most of the requirements before starting design or implementation.
  4. You try to define most of the design before starting implementation; you try to fully define and commit to an architecture before iterative programming and testing.
  5. A “long time” is spent doing requirements or design work before programming starts.
  6. You believe that a suitable iteration length is four months long, rather than four weeks long (excluding projects with hundreds of developers).
  7. You think UML diagramming and design activities are a time to fully and accurately define designs and models in great detail, and of programming as a simple mechanical translation of these into code.
  8. You think that adopting the UP means to do many of the possible activities and create many documents, and thinks of or experiences the UP as a formal, fussy process with many steps to be followed.
  9. You try to plan a project in detail from start to finish; you try to speculatively predict all the iterations, and what should happen in each one.
  10. You want believable plans and estimates for projects before the elaboration phase is finished.
  11. Are you involved in such a situation at your company?

    Tags: , ,

Do you need closures in Java?

TheServerSide has raised a question about whether closures proposals to be implemented in the Java language are really necessary. In my opinion, I think the Java language must be as it is, because:

  • Generics syntax introduced in Java 1.5 are very difficult to understand and parse when code is read; mixing it with closures will keep the code a little messy;
  • People would prefer to do things in the way they are used to, instead of learning a new construct in the language to implement their tasks (it’s better to focus on code maintenance and readability, after all, code is more read than written);
  • Anonymous-inner classes are far less readable than inner classes, imagine when closures appear in such a code;

So, I think it’s better to maintain the language with the abstractions it already offers and focus on other improvements, like reifiable generics, that is, making generic type information available at runtime. And you? Will you think useful closures on the Java language?

Tags: ,

Web 2.0 ‘neglecting good design’

Here is an interesting interview with the usability guru Jakob Nielsen which he says web firms are so emphasized in the hype of Web 2.0 as the “latest fashion” and at the same time the basic principles of webpages usability are always being forgotten. He claims about companies have to focus first in making good practices available like “making a site easy to use, good search tools, the use of text free of jargon, usability testing and a consideration of design even before the first line of code is written”. Also, Mr Jakob Nielsen says, as a interesting note, “The idea of community, user generated content and more dynamic web pages are not inherently bad in the same way, they should be secondary to the primary things sites should get right.”

Tags: ,

Google Guice, dependence Inversion in the Java way

Check out this great video about the new Java based inversion control framework from Google. The guys Kevin Bourillion and Bob Lee explains the concept behind dependency inversion principle (dip) and the core features inside Google Guice, called ‘juice’. The framework embraces and uses annotations instead of string identifiers (heavily used in Spring) to inject dependencies into the code. The most interesting feature is that Guice injects constructors, fields and methods (any methods with any number of arguments, not just setters) . You can also integrate Spring with Guice. Enjoy!

Tags: , ,