Friday, May 10, 2013
Review Board
I have recently discovered Review Board, which is a great code review tool - free even for commercial use, powerful, yet easy to use. Back in 2008 I had already been in search for a review tool that would plug into Visual Studio and Team Foundation Server, but didn't find any good ones. Review board had already been around back then, I should have used it, even if there was no specific integration for TFS. I hear that Visual Studio 2012 now provides a code review feature, which is nice, but this comes a little bit late...
Friday, April 26, 2013
Widget Factory Software Organizations
Oh, you got to love this one (taken from "Why do business analysts and project managers get higher salaries than programmers?"):
Widget Factories are born out of management school of thought revolving around motivation Theory X proposed by McGregor: rank employees are lazy and require constant control and supervision, jobs are held in the name of a pay check, managers are always able to do their subordinates' jobs to the higher or, at least, same standard. This thinking lands to a natural idea that the entire team can easily be replaced with and represented by the manager alone - after all everyone else on the team is either easilly replacable or there just to enhance manager's ability to complete tasks. Hence the hierarchy as a structure and rather horizontal job roles.
Widget Factory management operates on the assumption that software can be manufactured out of a specification prepared by a business analyst through a clearly defined process run under the close supervision of a project manager. The manufacturing is taken care of by staffing the project with enough qualified yet interchangeable programming and testing resources. Work is driven by a prearranged budget based on the initial business case prepared by PM and BA.
Management that runs a Widget Factory is easy to spot just by paying attention to the way these people talk. They are likely to be on about resources (including when referring to team members), processes, operating efficiency, uniformity, repeatability, strict control over use of resources, clear-cut job roles and defined process inputs and outputs. They'd casually mention the actual factory metaphor when trying to convey the image of the ideal software development operation as they see it.
Now, it won’t come as a surprise that most in-house software development teams and some consultancies are run as Widget Factories relying on a process to produce consistently boring software.
Tuesday, October 09, 2012
SqlServer Database Collation and TempDB
Insightful article (as always) from Kimberly Tripp on changing SqlServer database collation and possible side-effects when joining TempDB tables.
Friday, October 05, 2012
Net Negative Producing Programmers
Excellent posting here from Mehdi Khalili on Net Negative Producing Programmers.
Tuesday, July 03, 2012
Joel Spolsky and the Google Toolbar
I was listening to the "I'm Feeling Lucky: The Confessions of Google Employee Number 59" audiobook the other day, and was surprised hear the following:
I think the Google toolbar was introduced in 2000, back when the Joel-on-Software blog was in its heyday. But I don't remember Joel ever blogging about being involved in the Google toolbar development. I did a quick search now, and all I encountered was this Fog Creek discussion forum posting from 2003. Would be interesting to find out more on that...
"One of those products was a toolbar that tucked a searchbox right into users' browsers, enabling them to conduct Google searches without going to google.com. The product had been worked on by Joel Spolsky, a contract developer, based on prototypes developed by my UI team colleague Bay Chang."
I think the Google toolbar was introduced in 2000, back when the Joel-on-Software blog was in its heyday. But I don't remember Joel ever blogging about being involved in the Google toolbar development. I did a quick search now, and all I encountered was this Fog Creek discussion forum posting from 2003. Would be interesting to find out more on that...
Tuesday, June 12, 2012
ITIL
I was about to write my own little posting about ITIL, until I stumbled upon Jeff Ello's article on computerworld.com. He expresses the problem with things like ITIL much more eloquently than I could, so let me just quote him:
For example, ITIL is a self-described set of "best practices for IT Service Management." Many companies have spent many millions implementing ITIL-based processes, despite the lack of any science confirming its efficacy. The logic of ITIL is hard to argue with. But while each new faithful implementation shows short-term promise, I have yet to see a mature ITIL-based organization that isn't oversized, misshapen and grossly inefficient. It's not that ITIL doesn't work -- in fact, it works exactly as one should expect. ITIL groups are acutely aware of their costs and processes, which is a primary goal of following the ITIL program. On paper, it's very convincing. But ITIL organizations develop a resistance to pragmatic, incremental innovations that others quickly, if sometimes recklessly, adopt. This not only frustrates existing innovators; it makes hiring innovators a contrary act. Over time, that leads to an overall shift in staffing, with deficiencies in key roles that further deteriorate the group's ability to keep up, much less lead. While others race by on an uncertain diet of cheaper, faster, better, stumbling every so often, ITIL groups are typically forced by the weight of their own bureaucracies to stagnate, then belch changes in massive, expensive eruptions.
Monday, December 19, 2011
Sunday, December 18, 2011
JAX-WS: WSDL Fetched During Service Proxy Creation
I did some webservice client programming again lately, and was surprised to learn that by default, the JAX-WS service client library fetches the WSDL from its original location again each time a service proxy is created. I am pretty sure that not everyone is aware of that, and that this leads to production system problems once WSDLs become unavailable.
The JAX-WS FAQs mention runtime binding as the reason behind this, but as the WSDL is not supposed to change, I wonder why it isn't simply mapped into a generated Java class, or added as a local resource. Anyway, this can be done manually using the JAX WS wsgen tool (commandline option "-wsdl"), adding the local WSDL file to your JAR file, and then setting the service proxy's WSDL_LOCATION constant to:
The JAX-WS FAQs mention runtime binding as the reason behind this, but as the WSDL is not supposed to change, I wonder why it isn't simply mapped into a generated Java class, or added as a local resource. Anyway, this can be done manually using the JAX WS wsgen tool (commandline option "-wsdl"), adding the local WSDL file to your JAR file, and then setting the service proxy's WSDL_LOCATION constant to:
MYSERVICE_WSDL_LOCATION =
new URL(
MyClass.class.getResource(""),
"MyWsdl.wsdl");
Wednesday, December 14, 2011
Chickens Can Do Your Job

And because chickens can do a developer's job, most interviewers don't verify a candidate's skills by asking technical questions. That might hurt the candidate's feelings after all! Some interviewers might have heard of studies stating that, from a group of people with identical formal qualification, the top-notch folks can outperform their counterparts by a factor of 10 in efficiency (that is coding productivity, code quality, correctness and performance, whatever measure you choose). More than that, even people with lower formal qualification can be more efficient up to a factor of 10, compared to the other end of the spectrum.
But does that mean most companies will be searching for top-notch developers only, and once they have found them, pay them accordingly, treat them with respect, and give them tasks that match their skills? No! Developers are developers are developers. They are interchangable, and what they don't know now, they will simply learn on-the-job. It's that easy!
Tuesday, November 22, 2011
COM Programming
Luckily, with all those ATL macros and wizards available, resp. with COM-specific annotations in case of .NET, COM development became a lot easier over the years. Still, I would recommend everyone who is programming in COM, or even just reusing an existing COM component, to at least once walk through the complete process of manually implementing and registrating a COM component (including ClassFactory and hand-written registration code), to find out what's going on under the hood. A very nice step-by-step tuorial can be found at codeguru.com.
Monday, October 03, 2011
Tips For Lightning-Fast Insert Performance On SQL Server
1. Increase ADO.NET BatchSize to eliminate unnecessary network roundtrips, e.g. SqlDataAdapter.UpdateBatchSize when working with DataAdapters, or SqlBulkCopy.BatchSize when applying SqlBulkCopy.
2. Limit the number of indices on the target table to what is really essential for query performance.
3. Place indices on master table columns referenced by the target table's foreign keys.
4. Choose the target table's clustered index wisely, so that inserts won't lead to clustered index node splits. Usually an identity column (AKA "autoinc") is a good choice. If you don't have autoinc primary keys, consider introducing a new identity column just for the sake of making it your clustered index.
5. Let the client insert into a temporary heap table first (that is, a table that has no clustered index, resp. no index at all). Then, issue one big "insert-into-select" statement to push all that staging table data into the actual target table. The "insert-into-select"-statement must contain an "order-by"-clause which guarantees ordering by clustered index.
6. Apply SqlBulkCopy.
7. Decrease transaction logging by choosing bulk-logged recovery model, resp. setting SqlServer traceflag 610.
8. If your business scenario allows for it, place a table lock before inserting. This will make any further locking unnecessary, and is especially a viable option on staging tables as described in (5). SqlBulkCopy also supports table locks via SqlBulkCopyOptions.
9. Place database datafile and logfile on two physically separated devices, e.g. on two disks or two SAN LUNs configured for different spindles.
10. Prefer server-side processsing (e.g. by means of "insert-into-select") to client-to-server-roundtrips wherever possible.
11. This is probably the fastest insert-approach I have ever heard of (taken from this sqlbi whitepaper, see final paragraph): Create a new heap table just for the current insert batch, SqlBulk-Copy data into that table, then create a suited clustered index on the table, and add the table as a new table partition to an existing partitioned table.
12. Check execution plan when inserting, and go sure it does not contain anything unexpected or dispensable that might slow down your inserts, e.g. UDF-calls during check constraint execution, heavyweight trigger code, referential integrity checks without index usage or indexed view updates.
2. Limit the number of indices on the target table to what is really essential for query performance.
3. Place indices on master table columns referenced by the target table's foreign keys.
4. Choose the target table's clustered index wisely, so that inserts won't lead to clustered index node splits. Usually an identity column (AKA "autoinc") is a good choice. If you don't have autoinc primary keys, consider introducing a new identity column just for the sake of making it your clustered index.
5. Let the client insert into a temporary heap table first (that is, a table that has no clustered index, resp. no index at all). Then, issue one big "insert-into-select" statement to push all that staging table data into the actual target table. The "insert-into-select"-statement must contain an "order-by"-clause which guarantees ordering by clustered index.
6. Apply SqlBulkCopy.
7. Decrease transaction logging by choosing bulk-logged recovery model, resp. setting SqlServer traceflag 610.
8. If your business scenario allows for it, place a table lock before inserting. This will make any further locking unnecessary, and is especially a viable option on staging tables as described in (5). SqlBulkCopy also supports table locks via SqlBulkCopyOptions.
9. Place database datafile and logfile on two physically separated devices, e.g. on two disks or two SAN LUNs configured for different spindles.
10. Prefer server-side processsing (e.g. by means of "insert-into-select") to client-to-server-roundtrips wherever possible.
11. This is probably the fastest insert-approach I have ever heard of (taken from this sqlbi whitepaper, see final paragraph): Create a new heap table just for the current insert batch, SqlBulk-Copy data into that table, then create a suited clustered index on the table, and add the table as a new table partition to an existing partitioned table.
12. Check execution plan when inserting, and go sure it does not contain anything unexpected or dispensable that might slow down your inserts, e.g. UDF-calls during check constraint execution, heavyweight trigger code, referential integrity checks without index usage or indexed view updates.
Sunday, September 04, 2011
How To Make A Borderless WPF Windows Movable
Say you have a borderless WPF window (WindowStyle="None"), the problem arises, how can one still move/drag the window around on the desktop (as there simply is no more window title bar)?
It's actuelly pretty simple:
Thanks to Marlon for this hint.
It's actuelly pretty simple:
MouseDown += delegate { DragMove(); };
Thanks to Marlon for this hint.
Saturday, September 03, 2011
Is Your WPF ProgressBar Eating Up Unnecessary CPU Cycles?
When your WPF ProgressBar is causing lots of CPU usage, even if it is not visible any more, this most likely is caused by the IsIndeterminate property, which - when set to true - simply continues the animation to be running in the background.
One solution is to bind the IsIndeterminate property to the same underlying value as the Visibility property, for example something like this:
The IsBusy property of the bound DataSource can then represent whatever condition is suited in this scenario.
Thanks to Adam for this tip!
One solution is to bind the IsIndeterminate property to the same underlying value as the Visibility property, for example something like this:
<ProgressBar IsIndeterminate="{Binding IsBusy}"
Visibility="{Binding IsBusy,
Converter={StaticResource VisibilityConverter}}"/>
The IsBusy property of the bound DataSource can then represent whatever condition is suited in this scenario.
Thanks to Adam for this tip!
Wednesday, July 06, 2011
Friday, July 01, 2011
Confessions Of An IT Manager
As I stumbled back out into the light of the car-park, I wondered, for the life of me, how the IT industry had got in such a mess that unqualified and untrained people were in responsible positions within organisations all over the country, managing the databases that are the lifeblood of the enterprise.
What would happen if the same state of affairs infected Surgery, so that there was a chance of being operated on by someone whose only qualification was that he'd cut open his teddy bear as a child, using his 'My Little Doctor' kit, but managed to bullshit his way into a job armed with a bogus CV and a string of false references.
From: "Confessions of an IT Manager"
Subscribe to:
Posts (Atom)
