I am in the market for new opportunities. My interests are hedge funds, trading technology, .NET.
If you have something interesting going on, please email me at magmasystems@yahoo.com
I am going to take a few weeks off, investigate technologies that I have been too busy to investigate, and watch the rest of the World Cup.
©2006 Marc Adler - All Rights Reserved
Monday, June 26, 2006
Sunday, June 25, 2006
Things to Learn
Going through some of the reading from SIA. Tons and tons of stuff out there. On my "to-learn" list are:
MDDL - market data definition language, yet another XML-based way of transmitting financial info
Gigaspaces - grid-based infrastructure
Vhayu - real-time and historical data storage with real-time calculations and event broadcasting
Wombat - another high-speed market data and messaging platform
©2006 Marc Adler - All Rights Reserved
MDDL - market data definition language, yet another XML-based way of transmitting financial info
Gigaspaces - grid-based infrastructure
Vhayu - real-time and historical data storage with real-time calculations and event broadcasting
Wombat - another high-speed market data and messaging platform
©2006 Marc Adler - All Rights Reserved
Another Interesting Job Posting
http://newyork.craigslist.org/mnh/sof/173118487.html
They are located on the 4th floor of a building on Franklin Street, which is in the area of New York City called TriBeCa. In the old days, Franklin Street had many spacious lofts ... which got me thinking back to the days where a lot of young software companies worked out of lofts or apartments. In fact, in 1986, I worked for a young startup called Multex. There were 3 or 4 of us sitting in an apartment on West 53rd Street, coding apps for Goldman Sachs. Multex went on to expand, go public, and get bought out by Reuters.
Former Multex employee Brett Schlussman left just after me, and formed NetLogic with another former Multex guy (Michael St. Hippolyte) and a developer from Bankers Trust. They worked out of Brett's apartment in the 20's, taking Brett's Windows-based 3270 emulator that he developed for First Boston and selling it to Eicon.
We have interviewed a number of ex-Multex employees recently at Finetix. These were people who joined Multex after the Reuters merger. They had no idea that they were being interviewed by Multex employee number 5.
©2006 Marc Adler - All Rights Reserved
They are located on the 4th floor of a building on Franklin Street, which is in the area of New York City called TriBeCa. In the old days, Franklin Street had many spacious lofts ... which got me thinking back to the days where a lot of young software companies worked out of lofts or apartments. In fact, in 1986, I worked for a young startup called Multex. There were 3 or 4 of us sitting in an apartment on West 53rd Street, coding apps for Goldman Sachs. Multex went on to expand, go public, and get bought out by Reuters.
Former Multex employee Brett Schlussman left just after me, and formed NetLogic with another former Multex guy (Michael St. Hippolyte) and a developer from Bankers Trust. They worked out of Brett's apartment in the 20's, taking Brett's Windows-based 3270 emulator that he developed for First Boston and selling it to Eicon.
We have interviewed a number of ex-Multex employees recently at Finetix. These were people who joined Multex after the Reuters merger. They had no idea that they were being interviewed by Multex employee number 5.
©2006 Marc Adler - All Rights Reserved
Wednesday, June 21, 2006
SIA Technology Show 2006
I stopped by the Securities Industry Association show at lunchtime today. Walked around the exhibit hall and saw 1000 different instances of "the Wall Street Stack". Ow .... my head hurt from thinking about how many times the same stack has been rewritten in different ways for the sole purpose of displaying real-time charts and blotters. If you were a financial software company, how much would you pay for a completely operational version of The Stack?
Picked up a least 50 magazines, newsletters, and newspapers on trading technologies (hardly anyone was giving out T-Shirts this year -- I am a real T-Shirt collector). Waters Magazine still seems to be the best one out there for hard-core Wall Street developers.
There was a nice article on pages 21 and 22 of the Summer 2006 issue of Windows in Financial Services on a framework that I helped architect at Wachovia last year. The framework is what they now call OneSource. Several apps in Wachovia are based on OneSource, and I am happy to report that the ClientNet application that I worked on last year is being rolled out worldwide at Wachovia. One of the mags had a nice bit on the adoption of grid technololgies within Wachovia --- my man R.O. rolled that stuff out.
Larry from Finetix gave a nice talk on Quality Assurance in Capital Markets. Hopefully, some past and current clients attended that one! Larry is one of the best in the business.
Fourth of July coming up .... we have to get ourselves out to Block Island

©2006 Marc Adler - All Rights Reserved
Picked up a least 50 magazines, newsletters, and newspapers on trading technologies (hardly anyone was giving out T-Shirts this year -- I am a real T-Shirt collector). Waters Magazine still seems to be the best one out there for hard-core Wall Street developers.
There was a nice article on pages 21 and 22 of the Summer 2006 issue of Windows in Financial Services on a framework that I helped architect at Wachovia last year. The framework is what they now call OneSource. Several apps in Wachovia are based on OneSource, and I am happy to report that the ClientNet application that I worked on last year is being rolled out worldwide at Wachovia. One of the mags had a nice bit on the adoption of grid technololgies within Wachovia --- my man R.O. rolled that stuff out.
Larry from Finetix gave a nice talk on Quality Assurance in Capital Markets. Hopefully, some past and current clients attended that one! Larry is one of the best in the business.
Fourth of July coming up .... we have to get ourselves out to Block Island

©2006 Marc Adler - All Rights Reserved
Tuesday, June 20, 2006
Derman is in the House
Famed quant Emanuel Derman is blogging.
http://www.wilmott.com/blogs/eman/index.cfm
I just started reading his book My Life as a Quant. Interesting to read his experiences at Bell Labs at the start of the whole Unix/C movement in the late 1970's.
I will definitely have some more comments as I read through the book.
©2006 Marc Adler - All Rights Reserved
http://www.wilmott.com/blogs/eman/index.cfm
I just started reading his book My Life as a Quant. Interesting to read his experiences at Bell Labs at the start of the whole Unix/C movement in the late 1970's.
I will definitely have some more comments as I read through the book.
©2006 Marc Adler - All Rights Reserved
Sunday, June 18, 2006
Friday, June 16, 2006
YABGT (Yet Another Bill Gates Tribute)
I will join all of the other bloggers out there and put in my two cents about Bill Gates.
I had my first and only brush with Gates back in 1991 or 1992. I was a contributing editor for Microsoft Systems Journal back in the old days. One day, I get a call from my editor. He tells me that Bill Gates is stopping in New York for a night, on his way back to Seattle from a European trip. He wanted to have dinner with the MSJ contributing editors to tell them about some exciting stuff in the industry. Would I be interested?
We all met at a Japanese hotel on Park Ave at 32nd St. This hotel had a beautiful restaurant, and Gates, being a sushi fanatic, reserved a tatani room for us.
We all get there at 8PM, and then in walks Gates, followed by his flack, Jon Lazarus (who used to be the publisher of MSJ). In attendance was myself, Ross Greenburg (author of RamNet, and later, some virus-checking program), Greg Comeau (author of Comeau C++), Charles Petzold (author of a book), and Tony Rizzo (my editor).
Gates turned out to be a great guy, despite the constant leg movements under the table. Very personable. He spent most of the night talking about getting Dave Cutler from DEC, and the new operating system he was working on (Windows NT). Every word was preceeded by a stern warning from Lazarus never to repeat what was said.
Of course, the very next week, PC Week featured a big story on Cutler and NT!!!
©2006 Marc Adler - All Rights Reserved
I had my first and only brush with Gates back in 1991 or 1992. I was a contributing editor for Microsoft Systems Journal back in the old days. One day, I get a call from my editor. He tells me that Bill Gates is stopping in New York for a night, on his way back to Seattle from a European trip. He wanted to have dinner with the MSJ contributing editors to tell them about some exciting stuff in the industry. Would I be interested?
We all met at a Japanese hotel on Park Ave at 32nd St. This hotel had a beautiful restaurant, and Gates, being a sushi fanatic, reserved a tatani room for us.
We all get there at 8PM, and then in walks Gates, followed by his flack, Jon Lazarus (who used to be the publisher of MSJ). In attendance was myself, Ross Greenburg (author of RamNet, and later, some virus-checking program), Greg Comeau (author of Comeau C++), Charles Petzold (author of a book), and Tony Rizzo (my editor).
Gates turned out to be a great guy, despite the constant leg movements under the table. Very personable. He spent most of the night talking about getting Dave Cutler from DEC, and the new operating system he was working on (Windows NT). Every word was preceeded by a stern warning from Lazarus never to repeat what was said.
Of course, the very next week, PC Week featured a big story on Cutler and NT!!!
©2006 Marc Adler - All Rights Reserved
Sunday, June 11, 2006
Thursday, June 01, 2006
Housing Price Futures
I heard about this on NPR radio the other day ... A great way of hedging a housing market. If you are buying now, and are afraid that the housing market might fall through the floor in your town, then you can short the housing future. If you think that your area might see an uptick in housing, then long the future.
(from a CBS Marketwatch article)
The Chicago Merc introduced cash-settled futures and options based on housing markets in Boston, Chicago, Denver, Las Vegas, Los Angeles, Miami, New York, San Diego, San Francisco and Washington, as well as a weighted composite index.
The contracts are priced by multiplying the index value by $250; the average contract size for the various cities is roughly $55,000, although they vary by region, according to Sayee Srinivasan, associate director of research and product development at the CME. He said the exchange is considering adding contracts for other booming real-estate markets such as Phoenix and Orlando.
"The futures markets like volatility, so the contracts based on the most volatile housing markets might see the most volume," Srinivasan said.
For each region, there are four contracts, which expire on a quarterly basis, so there are currently contracts for August 2006, November 2006, February 2007 and May 2007.
Although the contracts have only been trading for a very short period, most of the interest is looking further out on the curve with the May 2007 contracts getting the most action initially, said Fritz Siebel, senior broker at Traditional Financial Services Inc.
There could be demand for longer-dated contracts, something the CME is considering if the existing contracts prove popular enough.
Siebel noted the early interest has been in derivatives based on hot West Coast markets in San Diego, Los Angeles and Las Vegas, and also Miami on the East Coast.
©2006 Marc Adler - All Rights Reserved
(from a CBS Marketwatch article)
The Chicago Merc introduced cash-settled futures and options based on housing markets in Boston, Chicago, Denver, Las Vegas, Los Angeles, Miami, New York, San Diego, San Francisco and Washington, as well as a weighted composite index.
The contracts are priced by multiplying the index value by $250; the average contract size for the various cities is roughly $55,000, although they vary by region, according to Sayee Srinivasan, associate director of research and product development at the CME. He said the exchange is considering adding contracts for other booming real-estate markets such as Phoenix and Orlando.
"The futures markets like volatility, so the contracts based on the most volatile housing markets might see the most volume," Srinivasan said.
For each region, there are four contracts, which expire on a quarterly basis, so there are currently contracts for August 2006, November 2006, February 2007 and May 2007.
Although the contracts have only been trading for a very short period, most of the interest is looking further out on the curve with the May 2007 contracts getting the most action initially, said Fritz Siebel, senior broker at Traditional Financial Services Inc.
There could be demand for longer-dated contracts, something the CME is considering if the existing contracts prove popular enough.
Siebel noted the early interest has been in derivatives based on hot West Coast markets in San Diego, Los Angeles and Las Vegas, and also Miami on the East Coast.
©2006 Marc Adler - All Rights Reserved
Wednesday, May 24, 2006
FX Settlements
The CLS website has a great picture on how settlements work for FX trades. Here it is:

CLS is a bank set up by a consortium of different financial firms. It what my client uses for settling their FX trades.
©2006 Marc Adler - All Rights Reserved

CLS is a bank set up by a consortium of different financial firms. It what my client uses for settling their FX trades.
©2006 Marc Adler - All Rights Reserved
Services for the Wall Street Stack
I have blogged before about the need for a standardized Wall Street Stack. At my current client, there are several different frameworks that have been built over the years, but no framework has gained enterprise-wide acceptance.
These are the services that are generally needed for a complete application framework. If you can think of any other, let me know.
Authentication - logging in to various databases, web servers, internal systems, etc. Best implemented through an enterprise-wide authentication service (using the user's Kerberos token, etc)
Authorization (Entitlements) - what actions can a user perform within an application and what data is a user entitled to see. Best accomplished through an enterprise-wide system.
Logging - log interesting things that happen in an application. Log4Net is a good framework.
User Preferences - load and save the state of the UI
User Data - each application may want to persist the last state of the application when the user logged off
Configuration - Each application should be configurable through a series of XMl files.
General Services Manager - drives the entire service locator framework
Applet Management - load applets from .NET assemblies
Internal Event Broker - lightweight communication between applets
Data and Persistence layer - ways to load, query, update and cache data. Should be configurable so that we can go through different transport layers
Service Agents - processed async notifications that come to us through subscriptions.
Shell - handles initialization of the application, calls all of the various services, provides presentation services for the applets
UI - menu manager, status bar manager, navbar manager, toolbar manager
Security/Cryptography - does the data need to be encrypted and decrypted? (passwords, sensitive data)
Exception Handling - provides a unified way of handling errors that occur in shell and the various applets
Threading - model for async processing
©2006 Marc Adler - All Rights Reserved
These are the services that are generally needed for a complete application framework. If you can think of any other, let me know.
Authentication - logging in to various databases, web servers, internal systems, etc. Best implemented through an enterprise-wide authentication service (using the user's Kerberos token, etc)
Authorization (Entitlements) - what actions can a user perform within an application and what data is a user entitled to see. Best accomplished through an enterprise-wide system.
Logging - log interesting things that happen in an application. Log4Net is a good framework.
User Preferences - load and save the state of the UI
User Data - each application may want to persist the last state of the application when the user logged off
Configuration - Each application should be configurable through a series of XMl files.
General Services Manager - drives the entire service locator framework
Applet Management - load applets from .NET assemblies
Internal Event Broker - lightweight communication between applets
Data and Persistence layer - ways to load, query, update and cache data. Should be configurable so that we can go through different transport layers
Service Agents - processed async notifications that come to us through subscriptions.
Shell - handles initialization of the application, calls all of the various services, provides presentation services for the applets
UI - menu manager, status bar manager, navbar manager, toolbar manager
Security/Cryptography - does the data need to be encrypted and decrypted? (passwords, sensitive data)
Exception Handling - provides a unified way of handling errors that occur in shell and the various applets
Threading - model for async processing
©2006 Marc Adler - All Rights Reserved
Universal DBs
Lately, I have been talking with IT directors at various financial firms. There seems to be one consistent message --- The holy grail that all of the financial firms are seeking is the universal database, where all trades across all asset classes can be held.
This is especially problematic at financial firms who keep buying other firms (Wachovia, Bank of America).
OLAP is a hot skill right now, and companies what to perform sophisticated queries over huge amounts of data. Finetix currently is working in the OLAP space int he commodities area of a major financial firm. This firm has asked Finetix to invent a cloning machine so we duplicate our 3 OLAP stars and sprinkle them throughout the firm. Maybe I should start attending Andrew Brust's presentations at the various .NET user groups.
©2006 Marc Adler - All Rights Reserved
This is especially problematic at financial firms who keep buying other firms (Wachovia, Bank of America).
OLAP is a hot skill right now, and companies what to perform sophisticated queries over huge amounts of data. Finetix currently is working in the OLAP space int he commodities area of a major financial firm. This firm has asked Finetix to invent a cloning machine so we duplicate our 3 OLAP stars and sprinkle them throughout the firm. Maybe I should start attending Andrew Brust's presentations at the various .NET user groups.
©2006 Marc Adler - All Rights Reserved
Sunday, May 14, 2006
How Do They Find Me?
I have been getting a bunch of calls from recruiters at my desk at my current client. I think that they know the telephone prefixes of the IT departments at the various Wall Street companies. The recruiters call every single number with that prefix in the middle of the night, and wait for the voice mail to kick in. So, they can get a name of a person at a desk at a Wall Street company.
The calls then come....
Recruiter : Hi Marc. I know someone who worked with you at your last company and they thought you were great.
Me (seeing the bullshit form a mile away) : That's fantastic! What company was that?
Recruiter : (sound of frantic typing in the background). Did you say that this was Marc Adler? Hmmm... it was ... XYZ.
Me : Who was the person that referred you?
Recruiter : Let me tell you about this position.
Me : (hangs up)
A recruiter's opening line says everything about his veracity and ethics. If a recruiter comes across like a telemarketer, I will not deal with him. A better line might be :
Recruiter : Hi Marc. I have been retained by Bank of America to hire a team that needs to build a credit derivatives system. Their platform will be a .NET front end, Java backend, wired together by Tibco EMS. Since you are working now for XYZ, and since I know that their credit derivatives systems use that precise technology, I was wondering if you or any of your teammates would be interesting in implementing a system like this over at BofA. Of course, the compensation would be above and beyond your current salary, which given your level, I could probably take a guess at.
Why is this good? I find out the name of the company who is hiring, and I already know that it's not with the company that I am currently with. (The worst thing is to find out that the job is for your position at your current company!). I see that the recruiter has taken the time to find out that I am with the credit derivs area, and has taken the time to know that my current client uses a particular technology. I see that the recruiter is aware of current salaries and could divine what it would take for an established player to move to another company.
I don't want to have to play games with a recruiter to find out about a position. Be straight, be honest. If I am truly interested in something, then I will not do an end-run around you.
Also, do you guys realize that, if you call me in the middle of the day, then the 5 people who sit around me usually hang on every word that I say on the phone?
©2006 Marc Adler - All Rights Reserved
The calls then come....
Recruiter : Hi Marc. I know someone who worked with you at your last company and they thought you were great.
Me (seeing the bullshit form a mile away) : That's fantastic! What company was that?
Recruiter : (sound of frantic typing in the background). Did you say that this was Marc Adler? Hmmm... it was ... XYZ.
Me : Who was the person that referred you?
Recruiter : Let me tell you about this position.
Me : (hangs up)
A recruiter's opening line says everything about his veracity and ethics. If a recruiter comes across like a telemarketer, I will not deal with him. A better line might be :
Recruiter : Hi Marc. I have been retained by Bank of America to hire a team that needs to build a credit derivatives system. Their platform will be a .NET front end, Java backend, wired together by Tibco EMS. Since you are working now for XYZ, and since I know that their credit derivatives systems use that precise technology, I was wondering if you or any of your teammates would be interesting in implementing a system like this over at BofA. Of course, the compensation would be above and beyond your current salary, which given your level, I could probably take a guess at.
Why is this good? I find out the name of the company who is hiring, and I already know that it's not with the company that I am currently with. (The worst thing is to find out that the job is for your position at your current company!). I see that the recruiter has taken the time to find out that I am with the credit derivs area, and has taken the time to know that my current client uses a particular technology. I see that the recruiter is aware of current salaries and could divine what it would take for an established player to move to another company.
I don't want to have to play games with a recruiter to find out about a position. Be straight, be honest. If I am truly interested in something, then I will not do an end-run around you.
Also, do you guys realize that, if you call me in the middle of the day, then the 5 people who sit around me usually hang on every word that I say on the phone?
©2006 Marc Adler - All Rights Reserved
Interesting Call From Microsoft Recruiting
It used to be where millions of applicants would send their resumes to Microsoft in hopes of a job. Howver, this is not your father's Microsoft anymore. The stock has been in the shitter for the past few years (I sold mine for a split-adjusted price of $30 in 2001, and the stock has never gotten higher), and the options program has been dessimated.
Somehow, a Microsoft recruiter got a hold of my name from some past colleague. There is a developer evangalist position open in the New York/New Jersey area. I happen to know the person who just left that position; he had been a familiar face at the various New Jersey .NET User Group meetings. This is not a bad position .... you get to go to companies and user groups around the NYC/NJ area and talk about the latest MS technologies from a developer perspective.
So, this recruiter kept calling and calling. I was not interested in the position at all, but I wanted to get another data point and hear what MS was offering senior-level architects and devs now. She would call me in the middle of the day, at my desk at my client, and I would patiently explain to her that I could not talk about a new job with 5 people sitting around me. She would make plans to call me in the evening, but then had to go pick up her kids somewhere, watch her neighbor's kids, etc. Always some excuse.
We finally managed to connect this week. She started to explain the job to me, but I told her that I was already very familiar with the responsibilities of the position. I told her to get down to brass tacks. What were they paying? I told her what my current base salary was so that we could start negotiating. My hopes would be that she could come close to the base,
She looked in her little black book, muttered to herself "hmmm... since this IS in the New York area, we have to give you a boost in the base", and came up with a number that is about 40% less than what I am making in base salary now.
To top it off, she then asked me why I would leave my current position for one that paid 40% less. This got me a bit steamed. I told her that:
a) It was YOU who have been persuing me, not the other way around. I never said anything about wanting to leave my current position.
b) I would NEVER leave for 40% less, unless it was topped off by outright stock grants that would raise my total comp to a figure that was way over the base (something that they will not guarantee for this position).
c) I told her that I was an avid reader of the Mini-Microsoft blog (she said something like "Oh No!"), and that under the current conditions at Microsoft, I don't think that I would be interested in subjecting myself to that type of lifestyle. In addition, I was not interested in interviewing with some 25-year old pisher who would be asking me logic questions like "How Do You Move Mount Fuji?".
She asked me if I had any colleagues who would be interested, whereby I replied that all of my colleagues who might be interested were making a lot more money than you just offered. I told her that I would never consider at MS until there was evidence of a complete culture change and/or there was sustained upwards movement in the stock price. I told her that she should study Mini-Microsoft very carefully, and note the exodus from her her company.
What an amazing turnaround for the prestige of Microsoft, a company that I used to admire. I consulted for MS for 3 years back from 198901992, writing the first front end for SQL Server. My former MS manager is a group VP, and is a millionaire many times over. But, I am afraid that most of the bright lights there have now been dimmed.
©2006 Marc Adler - All Rights Reserved
Somehow, a Microsoft recruiter got a hold of my name from some past colleague. There is a developer evangalist position open in the New York/New Jersey area. I happen to know the person who just left that position; he had been a familiar face at the various New Jersey .NET User Group meetings. This is not a bad position .... you get to go to companies and user groups around the NYC/NJ area and talk about the latest MS technologies from a developer perspective.
So, this recruiter kept calling and calling. I was not interested in the position at all, but I wanted to get another data point and hear what MS was offering senior-level architects and devs now. She would call me in the middle of the day, at my desk at my client, and I would patiently explain to her that I could not talk about a new job with 5 people sitting around me. She would make plans to call me in the evening, but then had to go pick up her kids somewhere, watch her neighbor's kids, etc. Always some excuse.
We finally managed to connect this week. She started to explain the job to me, but I told her that I was already very familiar with the responsibilities of the position. I told her to get down to brass tacks. What were they paying? I told her what my current base salary was so that we could start negotiating. My hopes would be that she could come close to the base,
She looked in her little black book, muttered to herself "hmmm... since this IS in the New York area, we have to give you a boost in the base", and came up with a number that is about 40% less than what I am making in base salary now.
To top it off, she then asked me why I would leave my current position for one that paid 40% less. This got me a bit steamed. I told her that:
a) It was YOU who have been persuing me, not the other way around. I never said anything about wanting to leave my current position.
b) I would NEVER leave for 40% less, unless it was topped off by outright stock grants that would raise my total comp to a figure that was way over the base (something that they will not guarantee for this position).
c) I told her that I was an avid reader of the Mini-Microsoft blog (she said something like "Oh No!"), and that under the current conditions at Microsoft, I don't think that I would be interested in subjecting myself to that type of lifestyle. In addition, I was not interested in interviewing with some 25-year old pisher who would be asking me logic questions like "How Do You Move Mount Fuji?".
She asked me if I had any colleagues who would be interested, whereby I replied that all of my colleagues who might be interested were making a lot more money than you just offered. I told her that I would never consider at MS until there was evidence of a complete culture change and/or there was sustained upwards movement in the stock price. I told her that she should study Mini-Microsoft very carefully, and note the exodus from her her company.
What an amazing turnaround for the prestige of Microsoft, a company that I used to admire. I consulted for MS for 3 years back from 198901992, writing the first front end for SQL Server. My former MS manager is a group VP, and is a millionaire many times over. But, I am afraid that most of the bright lights there have now been dimmed.
©2006 Marc Adler - All Rights Reserved
Monday, May 01, 2006
What I am doing now
At my new client, one of the Tier-1 IBs on Wall Street, I am now in charge of a FX Exception Processing System. What this system does is allow FX Operations to examine and fix any FX trades which did not go through for one reason or another.
The front end is all C#/.NET, communicating with a Java trade engine using both Web Services and a home-grown XML message broker. Sybase is the database, and from the backend, connectivity is to both CLS and to SWIFTNet.
The GUI uses the Infragistics toolset, and is very grid-intensive. The real-time element is not crucial, and the trade volume is light enough so that we do not have to consider switching to the SyncFusion grid right now.
Any FX Trade Events (in this system, notification of a broken trade is called an 'event') that occur are sent from the backend to our GUI using the message broker. All FX Trades are also sent to our GUI. If the trade that comes in matches a filter criteria that is set up in one of the grids, then the trade is updated (or, in some events, the trade is deleted from the grid).
As more and more groups come on line and use our system, we will be runing into scalability issues. For example, let's say that you have a grid open that is monitoring all trades that occur today. Let's also say that no filtering criteria is set up, other than the fact that you want to look at today's trades. This means that every new trade will be inserted into the top of the grid. This is OK for now, as the trade volume is relatively light. But, more groups have expressed using our GUI. We anticipate that, by the end of the year, we might experience 10x the volume we have now.
I am going to be writing some stress-testing tools that will help us analyze the possible impact of other groups using our system. More on this later.
©2006 Marc Adler - All Rights Reserved
The front end is all C#/.NET, communicating with a Java trade engine using both Web Services and a home-grown XML message broker. Sybase is the database, and from the backend, connectivity is to both CLS and to SWIFTNet.
The GUI uses the Infragistics toolset, and is very grid-intensive. The real-time element is not crucial, and the trade volume is light enough so that we do not have to consider switching to the SyncFusion grid right now.
Any FX Trade Events (in this system, notification of a broken trade is called an 'event') that occur are sent from the backend to our GUI using the message broker. All FX Trades are also sent to our GUI. If the trade that comes in matches a filter criteria that is set up in one of the grids, then the trade is updated (or, in some events, the trade is deleted from the grid).
As more and more groups come on line and use our system, we will be runing into scalability issues. For example, let's say that you have a grid open that is monitoring all trades that occur today. Let's also say that no filtering criteria is set up, other than the fact that you want to look at today's trades. This means that every new trade will be inserted into the top of the grid. This is OK for now, as the trade volume is relatively light. But, more groups have expressed using our GUI. We anticipate that, by the end of the year, we might experience 10x the volume we have now.
I am going to be writing some stress-testing tools that will help us analyze the possible impact of other groups using our system. More on this later.
©2006 Marc Adler - All Rights Reserved
Comings and Goings
In the United States, men are glued to their TV sets, watching the National Football League's annual college draft. This is the time when 26 football teams throw a ridiculous amount of money at elite college atheletes.
On Wall Street, the annual post-bonus dance is almost complete. As people received their bonus checks in February or March, news comes almost every day that this person or that person has departed for company X or Y. This has dessimated several's company's IT departments, as the one person who knows a certain application inside and out is suddenly no more .... and the mad scramble for talent starts anew as companies try to backfill these positions.
(Wall Street is very small ... never burn your bridges.)
Just like the NFL draft, those of us in Wall Street IT sit back and await news to see where our colleagues end up. Such is the situation with me. I sit back and monitor the blogs, anxiously waiting to see where Matt, Pin, and Deglan end up. Matt announced his resignation on his blog, and invited all comers to bid on his services. In his last blog post, he said that he had many offers from his blog readers. Whoever the lucky company is who ends up with Matt, it will be money well spent.
The bar has been raised slightly in terms of compensation packages for senior developers. On Wall Street, a total compensation package of slightly over $200K is becoming more common. The calls from headhunters are becoming more frantic, as Wall Street scrambles to fill positions of their dearly departed developers. The base salary seems to still be $150K, but on Wall Street, bonus is everything. Managing Directors typically make 200-300% in bonus. Developers are still in the 30-40% range in most companies,except for the premier companies, where your 18-hour days might get you upwards of 80%. But, as a colleague of mine told me recently, many a marriage has been sacrificed in exchange for that bonus.
©2006 Marc Adler - All Rights Reserved
On Wall Street, the annual post-bonus dance is almost complete. As people received their bonus checks in February or March, news comes almost every day that this person or that person has departed for company X or Y. This has dessimated several's company's IT departments, as the one person who knows a certain application inside and out is suddenly no more .... and the mad scramble for talent starts anew as companies try to backfill these positions.
(Wall Street is very small ... never burn your bridges.)
Just like the NFL draft, those of us in Wall Street IT sit back and await news to see where our colleagues end up. Such is the situation with me. I sit back and monitor the blogs, anxiously waiting to see where Matt, Pin, and Deglan end up. Matt announced his resignation on his blog, and invited all comers to bid on his services. In his last blog post, he said that he had many offers from his blog readers. Whoever the lucky company is who ends up with Matt, it will be money well spent.
The bar has been raised slightly in terms of compensation packages for senior developers. On Wall Street, a total compensation package of slightly over $200K is becoming more common. The calls from headhunters are becoming more frantic, as Wall Street scrambles to fill positions of their dearly departed developers. The base salary seems to still be $150K, but on Wall Street, bonus is everything. Managing Directors typically make 200-300% in bonus. Developers are still in the 30-40% range in most companies,except for the premier companies, where your 18-hour days might get you upwards of 80%. But, as a colleague of mine told me recently, many a marriage has been sacrificed in exchange for that bonus.
©2006 Marc Adler - All Rights Reserved
Saturday, April 29, 2006
College Admissions
I just returned from a trip to California with my son. We have just started to look at colleges for him. He is a junior in high school, but this is when kids start considering colleges seriously. We went to see U Cal at Berkeley, Stanford, and Pomona. All three very different colleges.
Warning to parents: good grades and good standardized test scores just don't cut it anymore. Stanford rejects an awful lot of kids who get 1600's on their SATs. All of the colleges want to see rigorous courses in high school, great grades, great SAT I and SAT II and AP/IB scores. But they also want students that are unique in some way. The essays that kids have to write for their college applications are extremely important.
It is not only amazing difficult to get into the top-tier schools. It is also getting increasing difficult to get into the upper-middle tier schools. Applications are skewed by professional college counselors who you can hire for $10,000 to $30,000 .... you wonder if a kid gets into a certain college because of his/her own worth, or because daddy's paycheck is fat enough to hire a pro.
Now, we have to capture the one big intangible that my son has into an essay .. the fact that he is a leader ... not in the academic sense (ie: he is not the editor of the school newspaper nor the quarterback of his school's football team) ... but the fact that he has packs of kids that follow him around, that kids are constantly calling him and messaging him, that he can snap his fingers and a whole cadre of students will appear to schlep his drumset from gig to gig. In other words, someone who has that special magnetism that command attention amongst his peers (think Tony Soprano).
I wonder if Stanford is interested in the future leader of La Cosa Nostra.....
(To the British readers here .. does the same thing apply to Oxford and Cambridge? Is most of the UK clamoring to get into these two schools?)
©2006 Marc Adler - All Rights Reserved
Warning to parents: good grades and good standardized test scores just don't cut it anymore. Stanford rejects an awful lot of kids who get 1600's on their SATs. All of the colleges want to see rigorous courses in high school, great grades, great SAT I and SAT II and AP/IB scores. But they also want students that are unique in some way. The essays that kids have to write for their college applications are extremely important.
It is not only amazing difficult to get into the top-tier schools. It is also getting increasing difficult to get into the upper-middle tier schools. Applications are skewed by professional college counselors who you can hire for $10,000 to $30,000 .... you wonder if a kid gets into a certain college because of his/her own worth, or because daddy's paycheck is fat enough to hire a pro.
Now, we have to capture the one big intangible that my son has into an essay .. the fact that he is a leader ... not in the academic sense (ie: he is not the editor of the school newspaper nor the quarterback of his school's football team) ... but the fact that he has packs of kids that follow him around, that kids are constantly calling him and messaging him, that he can snap his fingers and a whole cadre of students will appear to schlep his drumset from gig to gig. In other words, someone who has that special magnetism that command attention amongst his peers (think Tony Soprano).
I wonder if Stanford is interested in the future leader of La Cosa Nostra.....
(To the British readers here .. does the same thing apply to Oxford and Cambridge? Is most of the UK clamoring to get into these two schools?)
©2006 Marc Adler - All Rights Reserved
Event Manager Code - Possible Enhancements
Now that I have posted the code for the Event Manager that I have used in several projects, I would like to list some possible enhancements that I have considered:
Precompile regular expressions
The Event Manager supports wildcards. The .NET RegularExpression classes are used to perform matching of a published topic with a wildcarded subscription. Howver, I do not pre-compile the regexps. This is a very simple change to make.
Enhanced regular expressions
We can expand the regular expressions that wildcarded subscriptions will accept. For example, to subscribe to an insert or delete action for a trade, we should be able to have a wildcard topic that looks like this:
Magmasystems.TradingSystem.Trade.[InsertedDeleted]
Stronger typing of args for event declarations
The third argument of EventManager.Fire() is anything that derives from EventManagerArgs. We can add more type safety by specifying the subclass of EventManagerArgs that a publisher expects to send and that the corresponding subscribers expect to receive.
Scoping
Microsoft's CAB has the notion of event scoping. We can limit a published event to subscribers that run in the same thread (or a certain thread) as the publisher. We can limit the scope to a named "applet". Otherwise, by default, the event is published globally.
EventManager.Register(this)
I am not totally thrilled with the fact that, for every object that publishes or subscribes, a call to EventManager.Register(this) is called. The Register() function will examine the passed class, using reflection on the class to build up a dictionary of publishers and subscribers to a topic.
Dynamically register the publisher and subscriber
Instead of using the static way of decorating a method, we may want to add publications and subscriptions dynamically. For instance, we should be able to say something liek this:
EventManager.Subscribe("Magmasystems.TradingSystem.Trade.*", this.OnTradeEvent);
Sinks for event publishing
Implement Sinks so a class can have a crack at an event args before it is sent to the subscribers.
©2006 Marc Adler - All Rights Reserved
Precompile regular expressions
The Event Manager supports wildcards. The .NET RegularExpression classes are used to perform matching of a published topic with a wildcarded subscription. Howver, I do not pre-compile the regexps. This is a very simple change to make.
Enhanced regular expressions
We can expand the regular expressions that wildcarded subscriptions will accept. For example, to subscribe to an insert or delete action for a trade, we should be able to have a wildcard topic that looks like this:
Magmasystems.TradingSystem.Trade.[InsertedDeleted]
Stronger typing of args for event declarations
The third argument of EventManager.Fire() is anything that derives from EventManagerArgs. We can add more type safety by specifying the subclass of EventManagerArgs that a publisher expects to send and that the corresponding subscribers expect to receive.
Scoping
Microsoft's CAB has the notion of event scoping. We can limit a published event to subscribers that run in the same thread (or a certain thread) as the publisher. We can limit the scope to a named "applet". Otherwise, by default, the event is published globally.
EventManager.Register(this)
I am not totally thrilled with the fact that, for every object that publishes or subscribes, a call to EventManager.Register(this) is called. The Register() function will examine the passed class, using reflection on the class to build up a dictionary of publishers and subscribers to a topic.
Dynamically register the publisher and subscriber
Instead of using the static way of decorating a method, we may want to add publications and subscriptions dynamically. For instance, we should be able to say something liek this:
EventManager.Subscribe("Magmasystems.TradingSystem.Trade.*", this.OnTradeEvent);
Sinks for event publishing
Implement Sinks so a class can have a crack at an event args before it is sent to the subscribers.
©2006 Marc Adler - All Rights Reserved
Friday, April 28, 2006
Event Manager Code - EventManager.cs
Here is the code for the main EventManager class.
There are a number of ways that I would like to improve the code, but just never have had the time. When I get a few free moments, I will discuss some of the enhancements that I would like to put in the code eventually.
©2006 Marc Adler - All Rights Reserved
There are a number of ways that I would like to improve the code, but just never have had the time. When I get a few free moments, I will discuss some of the enhancements that I would like to put in the code eventually.
// for MethodImplAttrbute
using System;
using System.Collections;
using System.ComponentModel;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text.RegularExpressions;
// for ISynchronizer
// --------------------------------------------------------------------
//
// This code is (C) Copyright 2005 Marc Adler
//
// --------------------------------------------------------------------
namespace Magmasystems.EventManager
{
public delegate bool EventManagerEventHandler(object sender, string topicName, EventArgs e);
public class EventManager
{
#region Delegates
// Internal delegate used to help us fire async events
private delegate void AsyncFire(Delegate del, object[] args);
#endregion
#region Variables
// The singleton EventManager
private static EventBroker _theEventManager = null;
// A Dictionary of EventManagerEventInfo classes, indexed by the topic name
private Hashtable _theEventDictionary = null;
private Hashtable _theWildcardSubscribers = null;
// Used to disabled and re-enable the firing of events
private bool _isEnabled = true;
#endregion
#region Constructors and Static Instance
protected EventBroker()
{
}
// This is the way that the EventManager singleton is accessed
static public EventManager Instance
{
get
{
if(_theEventManager == null)
{
_theEventManager = new EventBroker();
_theEventManager._theEventDictionary = new Hashtable();
_theEventManager._theWildcardSubscribers = new Hashtable();
_theEventManager._isEnabled = true;
}
return _theEventManager;
}
}
#endregion
#region Properties
private Hashtable Dictionary
{
get
{
// make sure that the dictionary and event manager are instantiated
return _theEventDictionary;
}
}
private Hashtable WildcardDictionary
{
get
{
// make sure that the dictionary and event manager are instantiated
return _theWildcardSubscribers;
}
}
public bool Enabled
{
get { return this._isEnabled; }
set { this._isEnabled = value; }
}
#endregion
#region General Methods
static public void Register(object o)
{
Type type = o.GetType();
MethodInfo[] methods = type.GetMethods();
foreach (MethodInfo mi in methods)
{
// if(mi.DeclaringType != type)
// continue;
object[] oAttrs = mi.GetCustomAttributes(true);
foreach (object oAttr in oAttrs)
{
EventManagerEventInfo evInfo;
if(oAttr is EventSubscriberAttribute)
{
EventSubscriberAttribute evSubAttr = oAttr as EventSubscriberAttribute;
evInfo = FindTopicEntry(evSubAttr.Topic, true);
if(evInfo != null)
{
EventSubscriberInfo subInfo = evInfo.AddSubscriber(evSubAttr.Topic, o, evSubAttr.IsBackground, mi);
if(subInfo.HasWildcards)
{
EventBroker.Instance._theWildcardSubscribers[evSubAttr.Topic] = evInfo;
}
}
}
else if(oAttr is EventPublisherAttribute)
{
EventPublisherAttribute evPubAttr = oAttr as EventPublisherAttribute;
evInfo = FindTopicEntry(evPubAttr.Topic, true);
if(evInfo != null)
{
evInfo.AddPublisher(evPubAttr.Topic, o);
}
}
}
}
}
static private EventManagerEventInfo FindTopicEntry(string topicName, bool createIfEmpty)
{
EventManagerEventInfo evInfo ;
topicName = topicName.ToUpper();
object oEventInfo = EventBroker.Instance._theEventDictionary[topicName];
if(oEventInfo == null)
{
if(createIfEmpty)
{
// Allocate a new entry
evInfo = new EventManagerEventInfo();
EventBroker.Instance.Dictionary[topicName] = evInfo;
}
else
{
evInfo = null;
}
}
else
{
// Use the existing entry
evInfo = oEventInfo as EventManagerEventInfo;
}
return evInfo;
}
#endregion
#region Ways to Fire and Event
[MethodImpl(MethodImplOptions.NoInlining)]
static public void Fire(object sender, string topicName, EventArgs args)
{
if (EventBroker.Instance.Enabled == false)
return;
EventManagerEventInfo evInfo = FindTopicEntry(topicName, false);
if(evInfo != null)
{
evInfo.Fire(sender, topicName, args);
}
foreach (object oKey in EventBroker.Instance._theWildcardSubscribers.Keys)
{
string keyName = oKey as String;
Regex regExp = new Regex(keyName, RegexOptions.IgnoreCase);
if(regExp.IsMatch(topicName))
{
evInfo = EventBroker.Instance._theWildcardSubscribers[oKey] as EventManagerEventInfo;
evInfo.Fire(sender, topicName, args);
}
}
}
#endregion
#region Inner Class for EventManagerEventInfo
///
/// EventManagerEventInfo
/// This class represents information about a single event
///
public class EventManagerEventInfo
{
#region Variables
// Multicast delegate of all subcribers to this event
private event EventManagerEventHandler _eventHandler;
// The list of classes that publish this event
private ArrayList _publishers;
// The list of classes that subscribe to this event
private ArrayList _subscribers;
#endregion
#region Constructors
public EventManagerEventInfo()
{
this._publishers = new ArrayList();
this._subscribers = new ArrayList();
this._eventHandler = null;
}
#endregion
#region Events
public event EventManagerEventHandler EventManagerEvent
{
add { this._eventHandler += value; }
remove { this._eventHandler -= value; }
}
#endregion
#region Properties
public EventManagerEventHandler EventHandler
{
get { return this._eventHandler; }
}
public ArrayList Publishers
{
get { return this._publishers; }
}
public ArrayList Subscribers
{
get { return this._subscribers; }
}
#endregion
#region Methods
public EventSubscriberInfo AddSubscriber(string topicName, object objectRef, bool isBackground, MethodInfo mi)
{
EventSubscriberInfo subInfo = new EventSubscriberInfo(this, topicName, objectRef, isBackground, mi);
this._eventHandler += new EventManagerEventHandler(subInfo.OnPublisherFired);
this.Subscribers.Add(subInfo);
return subInfo;
}
public EventPublisherInfo AddPublisher(string topicName, object objectRef)
{
EventPublisherInfo pubInfo = new EventPublisherInfo(this, topicName, objectRef);
this.Publishers.Add(pubInfo);
return pubInfo;
}
public void RemoveSubscriber(EventSubscriberInfo sub)
{
this.Subscribers.Remove(sub);
}
public void RemovePublisher(EventPublisherInfo pub)
{
this.Publishers.Remove(pub);
}
#endregion
#region Event Firing
public void Fire(object sender, string topicName, EventArgs args)
{
// This handles the event firing to the SubscriberInfo class. In turn, the
// SubscriberInfo object will invoke the actual delegate. The SubscriberInfo
// object will determine whether the delegate shoul dbe called synchronously
// or asynchronously.
if(this.EventHandler != null)
{
this.EventHandler(sender, topicName, args);
}
}
#endregion
}
#endregion
#region Inner class for EventPublisherInfo
public class EventPublisherInfo
{
#region Variables
private EventManagerEventInfo _evInfo;
private WeakReference _objectRef;
private string _topicName; // the upper-cased name
private string _displayName; // used to generate context menus at runtime
#endregion
#region Constructors
private EventPublisherInfo()
{
this._objectRef = null;
}
public EventPublisherInfo(EventManagerEventInfo evInfo, string topicName) : this()
{
this._evInfo = evInfo;
this.DisplayName = topicName;
this._topicName = topicName.ToUpper();
}
public EventPublisherInfo(EventManagerEventInfo evInfo, string topicName, object objectRef) : this(evInfo, topicName)
{
this._objectRef = new WeakReference(objectRef);
}
#endregion
#region Properties
public WeakReference Publisher
{
get { return (this._objectRef.IsAlive == true) ? this._objectRef : null; }
set { this._objectRef = value; }
}
public string DisplayName
{
get { return this._displayName; }
set { this._displayName = value; }
}
#endregion
}
#endregion
#region Inner class for EventSubscriberInfo
public class EventSubscriberInfo
{
#region Variables
private EventManagerEventInfo _eventInfo; // ref back to the holding container
private WeakReference _objectRef;
private MethodInfo _methodInfo; // The method that the event firer should Invoke
private bool _isBackground;
private EventManagerEventHandler _delegateForAsync;
private string _topicName; // we may have wildcards
private bool _hasWildcards; // to help determine whether to use RegEx or not
#endregion
#region Constructors
private EventSubscriberInfo()
{
this._objectRef = null;
this._isBackground = false;
this._hasWildcards = false;
}
public EventSubscriberInfo(EventManagerEventInfo evInfo, string topicName) : this()
{
this._eventInfo = evInfo;
this.TopicName = topicName; // use the property so that formatting is done
}
public EventSubscriberInfo(EventManagerEventInfo evInfo, string topicName, object objectRef) : this(evInfo, topicName)
{
this._objectRef = new WeakReference(objectRef);
}
public EventSubscriberInfo(EventManagerEventInfo evInfo, string topicName, object objectRef, bool isBackground, MethodInfo mi) : this(evInfo, topicName, objectRef)
{
this._isBackground = isBackground;
this._methodInfo = mi;
if(isBackground)
{
this._delegateForAsync = (EventManagerEventHandler) Delegate.CreateDelegate(typeof (EventManagerEventHandler), objectRef, mi.Name);
}
}
#endregion
#region Properties
public object Subscriber
{
get { return (this._objectRef.IsAlive) ? this._objectRef.Target : null; }
}
public bool IsBackground
{
get { return this._isBackground; }
set { this._isBackground = value; }
}
public string TopicName
{
get { return this._topicName; }
set { this._topicName = FormatTopicName(value); }
}
public bool HasWildcards
{
get { return this._hasWildcards; }
}
#endregion
#region Methods
private string FormatTopicName(string topic)
{
// We want to make things easy for matching publishers and sunscribers.
// 1) We always use upper-case topic names.
// 2) Replace the dots with slashes so that the dot is not taken as a regexp
// character by the pattern matcher.
// 3) Let us know whether this topic has a wildcard in it so we know whether
// to use the slow regexp matcher or the faster Equals operator.
if(topic.IndexOfAny(new char[] {'*'}) >= 0)
this._hasWildcards = true;
return topic.Replace('.', '/').ToUpper();
}
#endregion
#region Event Firing
///
/// This gets called whenever the event manager fires an event.
/// This does the hard work in event firing. It eventually calls
/// the subscriber's delegate in order to process the event. it also determines
/// whether the delegate should be called synchronously or asynchronously.
///
///
///
///
///
//
public bool OnPublisherFired(object sender, string topicName, EventArgs args)
{
// If the object that this subscriber is bound to has been garbage-collected, then
// remove the subscriber from the EventInfo's subscriber list and return.
if(this.Subscriber == null)
{
this._eventInfo.RemoveSubscriber(this);
return true;
}
if(this.IsBackground)
{
AsyncFire asyncFire = new AsyncFire(InvokeDelegate);
asyncFire.BeginInvoke(this._delegateForAsync, new object[] {sender, topicName, args}, new AsyncCallback(Cleanup), null);
}
else
{
object oRet = this._methodInfo.Invoke(this.Subscriber, new object[] {sender, topicName, args});
if(oRet is Boolean)
return (bool) oRet;
}
return true;
}
private void InvokeDelegate(Delegate del, object[] args)
{
ISynchronizeInvoke synchronizer = del.Target as ISynchronizeInvoke;
if(synchronizer != null) // Requires thread affinity
{
if(synchronizer.InvokeRequired)
{
synchronizer.Invoke(del, args);
return;
}
}
// Not requiring thread afinity or invoke is not required
del.DynamicInvoke(args);
}
private void Cleanup(IAsyncResult asyncResult)
{
asyncResult.AsyncWaitHandle.Close();
}
#endregion
}
#endregion
}
}
©2006 Marc Adler - All Rights Reserved
Event Manager Code - EventManagerArgs.cs
These are two minor argument classes that are used to send information from the event publisher to the subscriber. The args are sent as the third parameter in the EventManager.Fire() function.
©2006 Marc Adler - All Rights Reserved
using System;
namespace Magmasystems.EventManager
{
///
/// Summary description for EventManagerArgs.
///
public class EventManagerArgs : EventArgs
{
public EventManagerArgs()
{
}
}
// This is used to pass string data between the publisher and subscriber
public class EventManagerMessageArgs : EventManagerArgs
{
private string _message;
public EventManagerMessageArgs(string msg)
{
this._message = msg;
}
public string Message
{
get { return this._message; }
}
}
}
©2006 Marc Adler - All Rights Reserved
Subscribe to:
Posts (Atom)