A collection of thoughts, ideas and rants inspired by my career in the fintech and banking industry.

Trust Me

The question of location comes up a lot in software consulting. Will the work be done on the client’s premises, or the consultant’s? There’s no right answer. Some clients don’t have the office space to accommodate an entire development team. Others already have a large IT department and want the consultancy’s team co-located with their existing staff.

Working at the consultancy’s office may afford certain perks like a relaxed dress code and flexible hours (are there still inflexible hours?). At the client’s site, the developers will have greater access to the people they need to talk to.

[Read More]

Good Advice

A thread appeared on Hacker News recently about how successful people operate. The comment below really struck a chord with me.

  • Don’t waste time.
  • Be mission/vision focused.
  • Be polite to everyone always.
  • Be helpful whenever possible.
  • Be insanely organized.
  • Seek and respond to constructive feedback on your work.
  • Do the shit work without whining.

All of this will build human capital with other people in the organization, which will both practically give you more resources of help from others to draw on in your work requirements, but also increases your visibility with people who aren’t on the front lines doing the work (e.g. Management). That visibility gives you the means to move in whatever direction you might desire. It also (for want of a better way to put it) usually tends to help make you layoff-proof because people know you are competent, professional, and have some flexibility to work as part of a team.

[Read More]
Career 

Git baffles

I’ve been using DVCSs for more than four years and I love them. Both Git and Mercurial are excellent source control tools, each with their strong points and their warts. The biggest difference between the two is the learning curve. I was very comfortable with Mercurial after only a few weeks and the same has held true wherever I’ve introduced it.

It took me about six months to get to the same comfort level with Git. And that was with three years of Mercurial experience under my belt.

[Read More]
Git 

Netezza: failed to create external table for bulk load

I came across an interesting problem recently in some JDBC code that was inserting rows into a Netezza database.

The Java code was doing something like this:

Statement stmt ...
for( SomeObject o : listOfObjects) {
	String sql = "INSERT INTO tbl(col1, col2) values (?,?)";
	...
	stmt.addBatch(sql);
}
stmt.executeBatch();

On the “executeBatch()”, a SQLException was being thrown that said “failed to create external table for bulk load”.

What? But it wasn’t a bulk load. There were no external tables involved - it was a batch of vanilla inserts.

[Read More]

Bi-temporal Data Model

A bi-temporal data model is a fancy way of saying that all tables have 2 pairs of dates: business from/to, and audit from/to. The business dates track expected day-over-day changes in business data such as the varying quantities of widgets in stock. The audit dates are used to track when the data was loaded into the database, and any data fixes applied by IT.

In essence, every table contains the current record as well as the full log of all the changes that were ever made to that record.

[Read More]

Throwing Under The Bus

Throwing somebody under the bus (ref) is a cowardly act, and one that particularly irks me. Nobody likes to be humiliated in front of others.

I’ve seen this happen countless time when a developer will point out a bug or error of another developer and use it as an excuse for not delivering on their own work. “I couldn’t load the data because of a bug in Johnny’s code”. Bullshit. If you were a team player then you would have pulled up a chair next to Johnny and tried to fix the bug so that the project could move forward.

[Read More]

Thoughts on Netezza

I’ve been using Netezza for a few months now and this post captures my opinions based on my limited experience. For context, I’m populating a Netezza database for a client. The database schema is managed by the client, and Netezza was selected prior to my involvement. Netezza is their data warehouse, but they’re also using it a little like an application database. They’re using a bi-temporal model, but that’s a subject for another post.

[Read More]

He who estimates, implements

I’ve been over the high-level requirements and think it’ll probably take 8 weeks with 2 developers, so you should be able to deliver this by X.

Well, that’s great. Can I presume that you’re one of the two developers working on it? I didn’t think so.

Nothing irks me more than being handed a batch of work along with the timeline for delivering it. If you want to estimate my work for me, then you can also go ahead and build it.

[Read More]

Hauppauge 950Q doesn't work with WD Live

According to the Hauppauge website, the Western Digital Live Hub works with the Hauppauge WinTV-HVR-950Q TV tuner.

It does not.

The Hauppauge app does the channel scan, but freezes when you try to change channels. In other words you have to reboot the WD Live box whenever you want to change channels. That doesn’t count as working in my books. Just sayin’…

A bit of Googling has shown that 950Q hardware Rev B may have worked, but the version commonly available in stores is Rev E. YMMV.

[Read More]

@Value not resolved when using @PropertySource annotation.

Spring’s gotcha-of-the-day is around using @Value to resolve property placeholders in combination with @PropertySource.

I had the following Spring Java configuration:

@Configuration  
@PropertySource("classpath:/test.properties")  
public class TestAppConfig {

    @Value("${queue.name}")  
    private String queue;
    
    @Bean(name="queue")  
    public String getQueue() {  
        return queue;  
    }  
}  

But the value in “queue” was not resolving - it returned “${queue.name}” as the value.

It turns out that I needed the following magical incantation to get it to work.

[Read More]
Java  Spring