Feed aggregator

DATE comparisons: the scenic route

Oracle WTF - Sun, 2007-04-08 07:37

Need to calculate the number of minutes between two dates? Yes, the dull way is to subtract one from the other and multiply by 1440. But why do that, when you can simply convert each date into Julian format by converting it into a string and then back to a date, and converting the resulting date into a Julian string, and (in a separate step) applying TO_NUMBER to the result to get an integer, so that you can simply subtract one from the other and multiply by 1440.

Except that rounds to the nearest day, so an additional step is to calculate the minutes since midnight for each of the two dates, which you can do by simply converting each date into an 'HH:MI AM' string, then back to a date, then back to an 'SSSSS' string, converting it to a number, dividing by 60 and adding it to the result of the first calculation. I think.

Anyway, consider the following library of handy date functions our Oracle WTF Easter gift to you, the online development community.

    FUNCTION julian_date
        ( date_to_convert DATE )

    FUNCTION minutes_since_midnight
        ( timevalue DATE )

    FUNCTION minutes_elapsed
        ( lowdate DATE
        , highdate DATE )

END dates_pkg;

    FUNCTION julian_date
        ( date_to_convert DATE)
        varch_value VARCHAR (10);
        num_value NUMBER (20);
               ( TO_DATE(TO_CHAR(date_to_convert,'MM/DD/YYYY'),'MM/DD/YYYY')
               , 'J')
        INTO   varch_value
        FROM   dual;

        SELECT TO_NUMBER (varch_value)
        INTO   num_value
        FROM   dual;

        RETURN (num_value);
    END julian_date;

    FUNCTION minutes_since_midnight (
        timevalue DATE)
        secs_elapsed NUMBER (20);
        mins_elapsed NUMBER (20);
               ( TO_CHAR(TO_DATE(TO_CHAR(timevalue,'HH:MI AM'),'HH:MI AM')
               , 'SSSSS') )
        INTO   secs_elapsed
        FROM   dual;

        SELECT (secs_elapsed / 60)
        INTO   mins_elapsed
        FROM   dual;

        RETURN (mins_elapsed);
    END minutes_since_midnight;

    FUNCTION minutes_elapsed
        ( lowdate DATE
        , highdate DATE )
        final_number NUMBER (20);
        low_julian NUMBER (20);
        high_julian NUMBER (20);
        num_days NUMBER (20);
        num_minutes NUMBER (20);
        temp_mins NUMBER (20);
        min_low NUMBER (20);
        min_high NUMBER (20);
        SELECT julian_date (lowdate)
        INTO   low_julian
        FROM   dual;

        SELECT julian_date (highdate)
        INTO   high_julian
        FROM   dual;

        SELECT (high_julian - low_julian)
        INTO   num_days
        FROM   dual;

        SELECT (num_days * 1440)
        INTO   num_minutes
        FROM   dual;

        SELECT minutes_since_midnight (lowdate)
        INTO   min_low
        FROM   dual;

        SELECT minutes_since_midnight (highdate)
        INTO   min_high
        FROM   dual;

        SELECT (min_high - min_low)
        INTO   temp_mins
        FROM   dual;

        SELECT (num_minutes + temp_mins)
        INTO   final_number
        FROM   dual;

        RETURN (final_number);

    END minutes_elapsed;
END dates_pkg;

Just for fun, let's test it:

CREATE TABLE wtf_test (start_date NOT NULL, end_date NOT NULL) AS
SELECT DATE '2006-12-25' + DBMS_RANDOM.VALUE(1,365)
     , DATE '2007-12-25' + DBMS_RANDOM.VALUE(1,365)
FROM   dual CONNECT BY LEVEL <= 1000;

-- ...several runs here to allow for caching etc, last set of results shown...

SQL> set timing on autotrace traceonly stat

SQL> SELECT dates_pkg.minutes_elapsed(start_date,end_date) FROM wtf_test;

1000 rows selected.

Elapsed: 00:00:03.96

  16000  recursive calls
      0  db block gets
     74  consistent gets
      0  physical reads
      0  redo size
   9330  bytes sent via SQL*Net to client
    809  bytes received via SQL*Net from client
     68  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
   1000  rows processed

SQL> SELECT (end_date - start_date) * 1440 FROM wtf_test;

1000 rows selected.

Elapsed: 00:00:00.16

      0  recursive calls
      0  db block gets
     74  consistent gets
      0  physical reads
      0  redo size
  25485  bytes sent via SQL*Net to client
    809  bytes received via SQL*Net from client
     68  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
   1000  rows processed

So the handy package version takes 25 times as long as the 1-line SQL version.

And in the interests of fairness, in case you're thinking perhaps that is just the normal overhead of calling PL/SQL functions in SQL, let's try our own function:

CREATE FUNCTION minutes_elapsed
    ( lowdate DATE
    , highdate DATE )
    RETURN (highdate - lowdate) * 1440;
END minutes_elapsed;

SQL> SELECT minutes_elapsed(start_date,end_date) FROM wtf_test;

1000 rows selected.

Elapsed: 00:00:00.26

     21  recursive calls
      0  db block gets
    107  consistent gets
      0  physical reads
      0  redo size
  25496  bytes sent via SQL*Net to client
    809  bytes received via SQL*Net from client
     68  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
   1000  rows processed

Still 15 times faster.

Many thanks to Padders for sharing this one.

Oracle Beefs

Robert Vollman - Thu, 2007-04-05 15:20
I've got very few beefs with Oracle. It is extremely complicated and tough to learn compared to other relational databases, but that's partially offset by the tremendous documentation, and the huge Oracle community.Don't get me wrong, I love Oracle. I'm regularly impressed by the sophisticated and often clever ways it handles the requirements of an RDBMS, and quick to recommend its use. But Robert Vollmanhttp://www.blogger.com/profile/08275044623767553681noreply@blogger.com5

Learn about .NET and Oracle at Collaborate07 in Las Vegas

Christian Shay - Thu, 2007-04-05 09:27
The International Oracle Users Group (IOUG) will hold its Collaborate 07 conference in Las Vegas (April 15-17). If you attend, be sure to check out the .NET session and demonstration kiosk to hear more about new .NET features for Oracle Database 11g.

Session: Oracle Database 11g: What's New for Java, JDBC, .NET, PHP, and OCI

This session will be hosted by myself and Kuassi Mensah.

We will also have a "Application Development Tools" booth in the exhibit hall where you can see demos of Oracle Developer Tools for Visual Studio .NET, ODP.NET and .NET Stored Procedures in Oracle, SQL Developer, Application Express, and JDBC.

Exhibit Hall: Oracle Database 11g - Application Development Tools booth (DB-007)

See you there!

Oracle Application Express 3.0 a credible alternative to Microsoft Access?

Donal Daly - Wed, 2007-04-04 10:45
I hope most people know by now that Oracle Application Express (APEX) 3.0 has gone production, is available for download from OTN and our hosted instance, apex.oracle.com had also been upgraded to 3.0. There has been some positive reviews in the press recently, here are links to a number of them:

Oracle Updates Application Express Tool
Oracle updates free Web development tool
Oracle has big ambitions for Application Express
Oracle improves free tool for building Web Applications
Oracle Application Express 3.0 Touts Access Migration

Most customers I talk with have problems with Access and are looking at alternatives, which I guess is the reason I am talking with them in the first place. However, Microsoft Access is a popular desktop database and was updated recently as part of the Office 2007. That said, it is desktop centric and more suited (optimized?) for productivity applications used by individuals or small groups.

On our OTN page about the Application Migration Workshop we have published a high level feature comparison of Access and Oracle APEX.

Is Oracle Application Express 3.0 a credible alternative to Microsoft Access?

What do you think?

Sjoerd Michels contributes to SOA Best Practice Series, on automated deployment

Clemens Utschig - Sun, 2007-04-01 21:00
I am very happy (and proud) that I managed to get Sjoerd Michels (AMIS), one of our fellow SOA champions in europe, on board to contribute a new chapter to my SOA Suite Best Practice Series on OTN.

"In this Technical Note, you will learn to set up an automated build and deployment environment for your Oracle SOA Suite project. (Release of Oracle SOA Suite features improved automated build capabilities; instead of the Oracle-specific obant Ant tool, plain-vanilla Ant is now used for building and deploying BPEL suitcases.) The goal is to automatically build Oracle's SOA Suite Order Booking demo application and deploy it to an Oracle Application Server instance that runs Oracle SOA Suite. Oracle's demo application is ideal here because it uses all the components in Oracle SOA Suite: Oracle Enterprise Service Bus (ESB), Oracle BPEL Process Manager, and Oracle Business Rules. The demo application also includes a number of Web services that are programmed in Java."

The whole article can be found here and while this one just got published there is lot more to come, especially around BPA, end to end design, and governance.

The next month will bring me back to europe to visit customers, help reviewing architectures, as well as speaking at several conferences throughout. Here is a sneak preview
  • SOA Telecom conference, Paris
    • Where I'll deep dive into implementing SOA in large enterprises and the many caveats when doing so

  • JAX (EAKON) 2007, Wiesbaden
    • After last year, I am happy to be back - this time on the SOA Management track, to evangelize together with a couple of good friends on the importance of the human factor

  • EOUC 2007, Amsterdam
    • The first year, the emea oracle user conference takes place, and it will be a blast - looking through the agenda, the lineup of sessions is unbelievable. I am happy to be part of it. This time it will be about technology, and the advanced concepts of the BPEL language.
If you are around, just send a ping, or come by the SOA booth after the session to say hello ..

IBM wants to finish JBoss

Omar Tazi - Thu, 2007-03-29 18:07
After losing its founder and leader to music and other personal interests shortly after being acquired by Red Hat, JBoss has a new set of issues to deal with. Marc Fleury left after sharing with his colleagues how he felt about working with Red Hat: "I am increasingly experiencing diminishing returns on my emotional and professional investments at Red Hat."

The new danger comes from outside. IBM and Covalent announced today that they had each contributed a significant amount of IP to Apache's Geronimo to help users migrate from JBoss to Geronimo. Although I personally consider this a serious attack on JBoss, Shaun Connolly (VP of product management in the JBoss division of Red Hat) begs to differ calling the IBM-Covalent initiative "uninteresting". I still think that JBoss today is far more superior than Geronimo if they play a feature war. But we all know the better products don't always win. I also believe that existing JBoss customers may not want to switch to a less performant application server if they are already in production. If it works why fix it? But I still think that when giants like IBM or Microsoft go after a much smaller company, we know how that movie ends.

Speaking of movies let's rewind the JBoss/IBM movie. Let me refresh your memory on a few events that put together are confusing to say the least:

- In September of 2003, JBoss and IBM team up to cool off the growing popularity of Microsoft's C#
- Not too long after this Marc Fleury started bashing BEA and IBM on his blog
- In May of 2005 IBM purchases Gluecode a company that employed most Apache Geronimo contributors and positions this acquisition as their entry level, lightweight application server. They later called the Geronimo-based product WAS Community Edition.
- Exactly two years after deciding IBM was nice and C#/Microsoft evil, Marc Fleury partners with Microsoft (Sept 2005). Their partnership shocked me (and I was not the only one) but I thought it was pretty clever after all. Marc described that day as his best day ever.
The idea there was that half JBoss servers were running on Windows so let's work together on making JBoss work even better on Windows and SQL Server,
Active Directory and single sign-on, etc.
- Then Red Hat buys JBoss, Microsoft becomes great friends with Novell and Fleury doesn't like working for Red Hat, fakes a paternity leave and never comes back to work. [Sorry I had to compress the story]
- Next IBM feels JBoss is kind of vulnerable and decides to partner with Covalent to hurt them even more, hence the announcement.

Concretely IBM
(which roughly employs half of Geronimo's committers) and Covalent (which already provides support for Apache's Tomcat, HTTP Server and Axis) are getting together to provide quality support for Geronimo and lure people away from JBoss. Paul Buck, director of IBM WebSphere open source said that they were going to provide a migration tool that would go through the J2EE application itself and look for any required changes at the source that we know are different between JBoss and Geronimo.

I am interested in your thoughts, do you think IBM with this move is going hurt JBoss' business in a significant way? Can somebody tell me why we never see Glassfish in these battles? It's also a Java EE open source application server but no one seems to take it seriously. I'd be interested to hear from anybody who reads this blog who uses Glassfish in the enterprise.

Oracle on The Linux Foundation Board

Omar Tazi - Thu, 2007-03-29 13:21
It's no news that Oracle has been a serious player in the Linux community. Our commitment to the Linux community started way back in 1998 when we released the industry's first commercial database on Linux. We also like Linux because we run our own IT systems on Linux and realize first-hand the benefit of lower IT costs from using Linux in a grid computing infrastructure. Additionally, Oracle's Linux kernel team contributed a cluster file system OCFS to the Linux kernel under the GPL license. OCFS2 was the first ever cluster file system in the mainline Linux kernel. Finally we recently announced Oracle Unbreakable Linux 2.0 which is a support program that provides enterprises with world-class global support for Linux.

All this to say that Oracle/Wim's nomination on the Linux Foundation board is no accident. Who better than Wim Coekaerts to represent Oracle on that diverse board?

Congrats Wim!

Programmatically removing all entities from a view object

Brenden Anstey - Tue, 2007-03-27 20:56
Recently I had a case where I needed to remove all rows from a view object and found that there was no existing method to do this.
The case for doing such an action is where there is a Master-Detail relationship and the detail relation is used only of there is a certain condition met in the master. If the condition is met then the detail is required, however if the user changes their mind then we need a way of removing any records that may have been created in the detail.

By adding the following method in the View Object Implementation class we can safely delete all records in the view object:

    public void removeAllRows(){
// rangeSize is -1
Row[] rows = getAllRowsInRange();
for (int r = 0; r < rows.length; r++)
if (rows[r] != null)


Apache Trinidad version 1.0.0-incubating

Omar Tazi - Mon, 2007-03-26 19:24

A little more than a year ago Oracle donated a rich set of UI components based on the JavaServer Faces specification to the Apache Software Foundation under the Apache 2.0 license. The donation was originally part of Oracle ADF and the community chose the name it Apache Trinidad. Today we’re excited to announce that we reached another milestone: the release of Apache Trinidad Core version 1.0.0-incubating.

Both binary and source code are available at the Apache Incubator Trinidad Podling page.

Live demos and release notes are also available.


Application Express 3.0

Herod T - Mon, 2007-03-26 09:03

We have eagerly been waiting for the release of APEX 3.0 , Last week, APEX 3.0 was made available for download. We use APEX extensively for internal application development and are porting many oracle forms applications that were internally developed to APEX. The users love APEX, the IT people love APEX, I as a DBA love APEX. We were looking forward to the PDF printing most of all, the ability to build PDF reports in APEX was going to be a huge feather in the cap for oracle and there was serious talk about having a vendor port a major application from a Delphi fat client to APEX, the vendor was on board, everything seemed to line up.

Then we installed APEX 3.0, the upgrade and installation on our test environment went perfectly, no problems at all. We start to read the documentation about the PDF printing, and we realize. We need to install XML/BI publisher to take advantage of the robust PDF printing that was all the rage. Well, that burnt us. Yes we can install the FOP stuff and do really basic reporting, but we had hoped the PDF generation was part of APEX 3.0.

We have had XML/BI publisher on the radar for awhile, knowing we will have to go to it with our Oracle E-Business suite upgrade later this year. I guess I had upgrade our evaluation copy to the newest version and see what has changed and try and figure out some business cases for spending the C$45,872 per CPU for XML/BI publisher.

We still love APEX 3.0, wonderful product, if your not using it, you should figure out a reason to.

Call PL/SQL from OAF

Andries Hanekom - Mon, 2007-03-26 04:33
In many situations developers need to execute PL/SQL code from there OAF application, be it legacy code or complex database manipulation better suited for PL/SQL.

The following example calls a PL/SQL procedure, passing in and receiving back parameter values. To ensure we athere to the MVC architecture, you must execute this code from your Application Module (AM). The method returns a HashMap object containing the two return values from the procedure, the HashMap can be returned to your controller, and used to raise a message for the user.

The following code is placed in your region or page controller, to call the method from your AM:

// Invoke the method
HashMap returnValues = (HashMap) am.invokeMethod(

// Get the returned values from the method
String status = (String) returnValues.get("Status");
String message = (String) returnValues.get("Message");

if (!status.equals("SUCCESS"))

// ERRORS from executePlsql
MessageToken[] tokens =
new MessageToken("STATUS", status),
new MessageToken("MESSAGE", message),

OAException errorMessage = new OAException("XX",
"XX_PLSQL_ERR", tokens,
OAException.ERROR, null);


The method to call your PL/SQL code, created in your page or regions AM:

import com.sun.java.util.collections.HashMap;
import java.sql.CallableStatement;
import java.sql.SQLException;
import java.sql.Types;

public HashMap executePlsql(String objectId, String objectSubType)
CallableStatement st = null;
HashMap returnValues = new HashMap(2);

String stmt = "BEGIN xx_pkg.xx_procedure( " +
"p_object_id => :1, " +

"p_object_sub_type => :2, " +
"p_status => :3, " +

"p_message => :4); END;";

OADBTransaction tr = getOADBTransaction();

st = tr.createCallableStatement(stmt, 1);

// Bind the input parameters
st.setInt(1, Integer.parseInt(objectId));
st.setString(2, objectSubType);

// Register return variables
st.registerOutParameter(3, Types.VARCHAR);
st.registerOutParameter(4, Types.VARCHAR);


// Assign returned values to variables
String status = st.getString(3);
String message = st.getString(4);


// Populate HashMap with return variables
returnValues.put("Status", status);
returnValues.put("Message", message);

catch (SQLException sqle)
throw OAException.wrapperException(sqle);

return returnValues;

OAF White Paper

Andries Hanekom - Mon, 2007-03-26 03:58

I recently presented a white paper at the 2006 South African Oracle User Group, an introduction to OAF development called: Oracle Applications Development Framework - The New Frontier

I hope this will help new comer's to get a good introduction to OAF development, extension and personalization. If there are any questions related to the white paper, please drop me a comment and I will reply a.s.a.p.

Please leave me a comment with your e-mail address and will get the document to you.

How to reduce coding by extending Managed Beans

Brenden Anstey - Sun, 2007-03-25 01:43
After coding many backing/managed beans it became clear to me that there were a few things that I seem to be doing over and over, these were:
  • Getting values from the binding layer
  • Setting values in the binding layer
  • Executing operation bindings
  • Using a combination of the above in a backing bean method

The logical thing to do was be to but my code for doing this into a class and extend this class for all of my managed beans. The class is called JSFBean and uses the binding "#{bindings}" to access the binding container. The three methods in the class (so far) are: execute, getValue and setValue.

The bean which I have called JSFBean includes these three methods and some basic error handling. When creating a backing bean simply add "extends JSFBean" to the class definition.

package com.delexian.ui.backing;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import oracle.adf.model.binding.DCBindingContainer;
import oracle.binding.OperationBinding;

public class JSFBean {

public JSFBean() {

public DCBindingContainer getBindings() {
FacesContext fc = FacesContext.getCurrentInstance();
ValueBinding vb = fc.getApplication().createValueBinding("#{bindings}");
DCBindingContainer dc = (DCBindingContainer) vb.getValue(fc);

return dc;

public boolean execute(String operation){
DCBindingContainer bindings = getBindings();
OperationBinding operationBinding = bindings.getOperationBinding(operation);
if (operationBinding == null){
FacesContext fc = FacesContext.getCurrentInstance();
fc.addMessage("Invalid Operation", new FacesMessage(operation + " is not a valid operation for this page"));
return true;


return operationBinding.getErrors().isEmpty();

public Object getValue(String el){
FacesContext fc = FacesContext.getCurrentInstance();
ValueBinding expr = fc.getApplication().createValueBinding(el);
return expr.getValue(fc);

public void setValue(String el, Object value){
FacesContext fc = FacesContext.getCurrentInstance();
ValueBinding expr = fc.getApplication().createValueBinding(el);
expr.setValue(fc, value);



An example usage in a backing bean Employees.java, extends JSFBean:
package com.delexian.ui.backing;

public class Employees extends JSFBean {
public Employees() {

public String calculate_action() {
return null;


Robert Baillie - Fri, 2007-03-23 02:44
I've had this conversation a couple of time with people, and I've realised that I can't get to a satisfactory answer without some research. And I'm lazy. So I'm going to pose a question... and if I don't get a satisfactory answer here I might well send it to The New Scientist in the hope that they'll answer it. Assuming that the cost of setting up and maintaining the infrastructure is already taken care of, which is more energy efficient: an electric kettle or a stove top kettle?


Rob Baillie - Fri, 2007-03-23 02:40
I've had this conversation a couple of time with people, and I've realised that I can't get to a satisfactory answer without some research. And I'm lazy. So I'm going to pose a question... and if I don't get a satisfactory answer here I might well send it to The New Scientist in the hope that they'll answer it.

Assuming that the cost of setting up and maintaining the infrastructure is already taken care of, which is more energy efficient: an electric kettle or a stove top kettle?

Oracle sues SAP

Herod T - Thu, 2007-03-22 22:26



I had seen some rumours floating around that Oracle was going to try and take over parts of SAP, guess the rumours were wrong, but some legal work was brewing. Makes you wonder who stated the rumours to begin with.

Enumeration types in PL/SQL?

Jornica - Thu, 2007-03-22 02:11

In the book Oracle PL/SQL for DBAs the definition of the type BOOLEAN is shown:

FROM all_source
WHERE owner = 'SYS'
AND type = 'PACKAGE'
AND line <5


/********** Types and subtypes, do not reorder **********/

4 rows selected.

Have you seen that kind of type definition before? I did, it looks like a Delphi enumeration type when you replace the is with = . Let's define our own type.

create package TRAFFIC is 

Warning: Package created with compilation errors.


2,19 PLS-00505: User Defined Types may only be defined
as PLSQL Tables or Records
2,3 PL/SQL: Declaration ignored

2 rows selected

Perhaps this is an enhancement request for Oracle 11g release 2?

Physical Standby Turbo Boost

Eric S. Emrick - Mon, 2007-03-19 19:51
Is your physical standby database lagging way behind your production database? Maybe an outage to your standby environment has produced a lag that will not meet certain business requirements: reporting needs, disaster recovery time objective, testing, etc. When you don't have the luxury of performing a full production restore into your standby environment and your archive log files are not being consumed at an acceptable pace, you still have options that don't involve immediate architectural changes.

In some cases you can dramatically speed up your recovery time by copying a small subset of your production database to your standby environment and resume recovery. For example, if a large percentage of your database's write activity is absorbed by a small subset of your database you are primed for a standby recovery turbo boost. Notice I did not say small percentage of your data files. After all, you could have 90% of your writes going to 10% of your data files, but those data files might comprise 90% of your database footprint. In most cases a small percentage of your database files equates to a small subset of your database, but not always.

If a vast majority of writes go against a small subset of your database, how would copying these files to your standby give your recovery a boost? During recovery if Oracle does not need to recover a file it won't. All of those redo entries dedicated to recovering those files will just get passed over. Knowing this simple fact can help you get your physical standby database back on track to meet the needs of your business quickly.

The first order of business is to determine if the write skew condition exists in your database: those files, if copied to your standby, benefiting your recovery time the most. Fortunately, this information can be easily gathered using the v$filestat and v$datafile dynamic performance views in your production database. The following query will get you the top N most written to files in your database.

select * from
(select a.name, b.phyblkwrt from v$datafile a, v$filestat b
where a.file# = b.file# order by 2 desc)
where rownum < N;

If you know the data files that are getting written to the most in production then you also know the most frequently written to files on your standby during recovery. If Oracle can skip over redo entries during recovery then you avoid all of that physical and logical I/O against your standby data files. To recover a database block you have to perform a read and a write of that block. If your writes are somewhat evenly distributed amongst the files in your database then it will be more difficult to get that turbo boost. But, if 60+% of your database writes are absorbed by <= 10% of the database footprint you could gain a significant boost in the recovery time by shipping those files to your standby.

I know this is a rather short post, but this little tidbit just might help you get out of a physical standby database recovery dilemma.

I am still here...

Robert Baillie - Mon, 2007-03-19 17:27
Sorry people, I promise I'm still here and I WILL get round to finishing my text on estimating and answering the request for more info on the database patch runner. I will, I will, I will! The problem is, I've started reading again, and I've started playing on-line poker. Damn it :-) But I'm enjoying it, especially a Cohn book on Agile Estimation and Planning. It is an absolute MUST read. It takes off where the estimation chapter from User Stories Applied left off, and it really doesn't dissappoint. Unfortunately it seems to say an awful lot that I agree with, and was going to form the bulk of my next couple of posts. So if you like what I have to say on the topic, then Mike Cohn is definately worth a read... he goes into a lot more detail than I ever will here! Obviously I'm reading an awful lot on Texas Hold 'em as well... but I'm not going to tell you what 'cause that might take away my advantage ;-)

Producing Estimates

Robert Baillie - Mon, 2007-03-19 17:25
OK, so it's about time I got back into writing about software development, rather than software (or running, or travelling, or feeds) and the hot topic for me at the moment is the estimation process. This topic's probably a bit big to tackle in a single post, so it's post series time. Once all the posts are up I'll slap another up with all the text combined. So – Producing good medium term estimates... I'm not going to talk about the process for deriving a short term estimate for a small piece of work, that's already covered beautifully by Mike Cohn in User Stories Applied, and I blogged on that topic some time ago. Rather I'm going to talk about producing an overall estimate for a release iteration or module. I've read an awful lot on this topic over the last couple of years, so I'm sorry if all I'm doing is plagiarising things said by Kent Beck, Mike Cohn or Martin Fowler (OK, the book's Kent as well, but you get the point), or any of those many people out there that blog, and...


Subscribe to Oracle FAQ aggregator