pragmatic agility
Looks like a great series of articles here, I look forward to seeing how things progress.
Thanks Ben. I've been bulk posting several days at a time. Enjoy. Wayne
*Groan* :)
BuildIt : ShowUsYour-Blog!
Try Outlook2Rss at http://radio.weblogs.com/0106747/2003/02/19.html#a225
I tried to download it to take a look, but the zip file is empty. I'll give ScottH a shout to see what is up.
Ouch, my condolences :) I actually had two last year. Apparently my childhood doctor filled a cavity w/o properly cleaning it out... and when it started to hurt, they realized this and had to do a root canal!!
Writing Testable Code - Story: Retrieve RSS Feeds : Wayne Allen's Weblog
Anything to save $29.00, eh? :-) http://www.newsgator.com/
Hey, you don't even need to save $29... Check out nntp//rss - <a href='http://www.methodize.org/nntprss'>http://www.methodize.org/nntprss</a>.
Great tips for debugging services : CSharpener's Blog
Debugging onStart for a Windows Service : Loosely Coupled
Thats precisely the method I arrived at and it works really well.
Wayne Allen's Weblog
I've been putting shared libraries into the project, so that the particular version I was using at a certain time is saved into the source code control system as well as code.
I agree -- I'm a big fan of putting the shared libraries under source control in the project that references them, so that your tags and branches are actually what you had at that point. I actually go one step further, and put my tools into source control as well, so that I can pull the entire environment down if I need to (say NAnt or NUnit are upgraded in a non-trivial way, and I change my build files. I should still be able to build version 0.1.12.193 three years later, right? - I do make an exception for VS.NET, as it's friggin' huge!)
I have done two migrations from VSS to CVS. I have put all shared dlls into a top level directory (i.e, ThirdParty directory) and added a file reference in the relative project to the shared dll. We have a fully integrated build process with CruiseControl.Net, CVS, Nant and Nunit. One of the major goals of the migration was not to introduce a new build process to developers. Therefore we take advantage of using a XSLT translation of the project files to nant build files. This allows developers to add references, files, .... and the build sytem will automatically pick it up. Currently in the HEAD on nant, is a solution task that will go one step beyond the XSLT solution. This task will read solution and project files and create the correct references,dependencies and content. I have also created a "NukeSourceSafe" console app that will rid of all sourcesafe residue in a project. Dave
We use VSS, and so have all the companies I've worked with (which were all small-medium size so far). What about Rational? Don't they have ClearQuest? or was it ClearCase? I get mixed up..
I use VSS. It works for us rather well, it takes a while to setup correctly and learn the caveats and also the functionality which really makes it a good source control system, but after that it's ok. CVS on the other hand is hell on earth if you ask me. I tried to work with it on sourceforge for a while when I had a project located there, but it's too much of a burden to work with. You can't even rename files. I heared borland's tool is pretty good, but I don't know if they sell it as a separate product.
http://www.sourcegear.com/vault/index.asp SourceGear's Vault looks like a pretty nice solution, all built with SQL Server & C#
In terms of staying with a familiar environment, and not having to go through too much of a learning curve, you would be hard pressed to go past Vault. CVS is fine though, it just takes a bit of time to get your head around it coming from VSS. There is a Windows version of the server at www.cvsnt.org which is great too. The great thing with CVS (and Subversion) is the Tortoise tools ( www.tortoisecvs.org ). Tortoise is the most useful interface for source control I have ever used. Also, on the CVSNT site, there are some links to scripts to port over your existing VSS repository.
Currently we are using VSS and it works well for some things and not for others. Actually I should say the VSS integration with VS.NET doesn't work well on branched projects (it trys to reattach to the original project). We could turn off the integration, but since there isn't a TortoiseVSS I'd hate to go to the VSS UI for everything. Also we live in fear that the VSS database will corrupt and we'll lose a day or so worth of work.
We use Telelogic CM Synergy it is a nice product (also integrated into the Bug tracking System called CS) It has trouble with mainting Web Projects which also have databse components, but so does VSS Another thing missing is integration with our dev IDE (Visual Studio) but it works great and supports every Version Control Feature I can think of.
SBC DotNet Weblog
Good posting Wayne. See my response in my weblog - http://dotnetweblogs.com/sbchatterjee/posts/6900.aspx SBC
"Failure being defined as over budget, delivered late or both." Wayne: I disagree with that definition of "failure." A project completed late or over budget (within reason) may actually be hugely successful: What if it generates vast amounts of revenue, or creates a community of enthusiastic, satisfied users? Defining "success" solely in terms of schedule or budget is short-sighted and narrow-minded, IMO.
We need to exactly mirror sourcesafe structure in visual studio , rather we want to see the same folder hirarchy in both . Is there a way to do it. Thanks
I also disagree with the definition, I'm just pointing out that this definition is questionable and if we apply it to other industries software doesn't look that bad.
How many QA people? Can you split them, pull a couple of the QA people into the dev team and have them do the stuff that you describe in the 1 team scenario and then have a dedicated QA teamdoing all the stuff you describe in the 2 team scenario. Rotate the QA people from the dev team back into the main QA team from time to time. Maybe have new devs work with the QAs on the dev team whilst they're getting up to speed so they appreciate the need for solid code...
I'm finding that more and more of my 'application' code actually lives in a library and the application itself just wires the objects together and sets it going... Obviously easier if the app doesnt have a gui... Anyway, I find it makes for much more testable code.
Dewayne Mikkelson and his Radio WebDog, Shadow: Thursday, July 17, 2003
Java Extreme Programming Cookbook... Great book, and 95% of it translates to .NET
This is very similar to the User Experience role cluster in the Microsoft Solutions Framework.
Great! Looking forward to updates from your group (which I see you already posted one).
www.merant.com They have a collection of tools they are integrating - configuration and change management, requirements and defect tracking, etc. Main Product is Dimensions, they're going away from the name of the previous product PVCS.
Welcome aboard to the Vault world! I am currently working with Eric (and a few others) on implementing a continuous integration tool similar to Draco.Net for SourceSafe. Details to follow.
I have worked on buildIt , I hve tested it with the small solutions having one or two projects. Now I m testing it on a solution having multiple Project templates and these in turn have multiple projects(There are 4 setup projects included in this solution).As I execute the buildIt.bat file it takes around half hour and the command prompt hangs doing nothing and finally it dislpays a message that the Debug version failed.When I build it manually it goes fine.I need some help regarding this if someone can do it.
Sorry, I can't really help you. I don't actually us BuiltIt as we have standardized on Draco.NET. You might want to give it a try. http://draconet.sourceforge.net/ Wayne
Yup - +1. These 'huge features' don't really sound like a compelling selling point for VSS, do they? Solving VSS' problems will go a lot deeper than tacking on Unicode support.
Thanks for the update. I have not tried the migration tool, as I used Vault early enough in a project without having to deal with that.
I used Together extensively when I designed J2EE based apps in a large development team...however...the theory that it is faster and creates better apps by using that model is just not true (in my experience). What is does do is let the process be more transparent - so if you have a huge development team who otherwise don't communicate all that much, then, yes it is valuable. For quick, small projects such as the ones I currently work on, it is simply overkill.
I have a vision.... a diagram like a visio flowchart that is based on the .Net CodeDOM model.... one model, a GUI that shows the flow and loop / branch structure, a top-lelvel "Class / Type / UML " thing with the list of publics and so on.... the GUI shows a "Block" as a "BLOCK" so that if a While Loop has 50-60 lines in it I just see While (Cond) -- BLOCK and I can click on BLOCK to see the details and I can set a Level Of Detail that controlls how much the display is visualy drilling down past the current level.... like an interactive exploding diagram of my code... and when you debug.... you can "Desk Check" the "Flow Chart" visualy :-) IMHO we are able to do it now.... just need time and cash to write the VS plugin :-)
If Visio's UML integration didn't suck or XDE wasn't ungodly expensive, maybe I would. I believe very strongly in good design, but I find working with Visio to be very painful (at least for UML... database diagrams aren't too bad in Visio, since I get a two way sync). I'd rather use a piece of paper for my diagrams and hand code my interfaces.
Supposedly Microsoft is moving to Model-Driven Architecture, with roundtrip engineering, in future versions of VS.NET. If so, I would definitely model more in UML. Right now, though, Visio is indeed to painful to use with UML, except for reverse engineering to satisfy the documentation nazis.
Good suggestion but I would like to extend further than just the appSettings node. I am working on an post build component to do this but that does VB.NET people no good.
Blah, I'm surprised you could find your way around my code at all. :) I'm putting together an article for how to use our tasks to piece together an integrated build solution using NAnt, our tasks, and Vault. I hope to have it done today -- especially with the incredible increase in traffic on Vault List. One day I will finish this huge project at work and have much more time again to work on stuff like this. :) --Brian
The way how Vault handles labels during migration prevented us to consider move at present. Lets wait if next version with vss style labels will improve.
Interesting subject... I won't be able to attend, but I'd be interested in seeing any presentation material on the subject.
Just came across this while wandering about the internet, if your using any source control it'd look like a good alternative to the problem. http://www.bistrotech.net/weblog/default.aspx?date=2003-09-29 Regards, Alan
Great solution and good reference, thanks Alan.
This is actually the same behavior VB6 modules had, but apparently most VB6 developers never realized this since they worked primarily with Windows apps that serviced only one user at a time. I actually had a hard time tracking down an error in VB6 that resulted from this one time that a predecessor had did. Anyhow, this comes up often in the various forums, so its a rather significant stumbling block in ASP.NET for VB developers.
Yes - management is always the problem. It is because our industry is immature - unlike oil, others most managers did not grow up through the engineering ranks.
Big Call...
How long ago was the code written? Personally, I have discovered that code even I have written perhaps 3-4 years prior often seems crusty when I look at it again. Then again, SOME of my code does hold up, and as I see that, I try to jump onto whatever seems to have caused that code to continue to look OK even years later.
Also, I do concur that programmers who are good are often those who are driven to learn and grow. How many programming related books have they read in the last year? Do they have a development setup at home?
>How long ago was the code written? I agree with your comments, but I am talking about freshly minted code, version 1.0 and all that good stuff. And still the code smells to high heavens.
I quit. Not long before I handed in my resignation ( 3 more work days, and then I start the new job), I said to the new Architect/Manager and Buisness Manager. "Do you know what the difference between me and them is? Last night they were watching the new extended version of Lord of The Rings and I was writing code." My old code sucks (most good programmers will agree that their old code sucks), but it can be fixed, by me or by you, without trouble. There are a lot of people who write code because it is their job. Programming is my craft. It isn't about willingness, it is about hunger.
I experience these same things in our corporate environment. To change this I have started offering my services as a consulting-basis to other teams on an as needed basis. I offer to look over what they are doing or planning and offering my advice. Of course I can't force them to follow it but it does help. Just recently I caught an application going into production that used web services to get all the data it needs. Reason being, just because they could. There was no business need behind it other than they thought it would allow the application span to grow easier. Considering our target audience will be .NET developers there was no need for this. So I suggested they build the business services API for the data access and if in the future we need this data exposed to non.NET platforms or external vendors we can use the API objects to create the web services ... they decided that would be the better way to go. (I only got wind of this because our NT admin team was haivng trouble configuring the web services to work in our environment and I'm the go to guy for all .NET issues in the end) Just one simple example of success. Now one of a failure. We are implementing MSMQ messaging to transport MAINFRAME data to our RDBMs (informix among many) well the MAINFRAME guy that understands a little bit of Win32 environment started setting up MSMQ and wrote the entire communication API without my input ... they didn't do to bad but its still not good .. they won't take any advice on how to code the protocol handling ...its very limited currently and I'm just glad I don't have to use it ... well to get messages around they were planning on using triggering in MSMQ to run instances of programs to process queues ... this is ok but there are some huge downfalls considering we will have thousands of queues with thousands of programs processing them ... the maintanence is going to be huge ... I suggested windows services - 50 lines of code to get one up and running (and installed) ... but they can't see the benefit or are afraid to take the unknown route. I told them that would be better (at the time never having written the code, 30 minutes later I had simple proof of concept) ... they still seem to be pushing me off And the only reason I ever got wind of this? Because they were having security issues and no one really understood the architecture of the infrastructure for the messaging api's ... In my honest opinion our developers are shooting themselves by having too much pride and not coming to someone who is more knowledgable in areas of architecture (especially in correlation to .NET) than they are... I'm not saying I'm a master, but I am at this company ... things are better I convinced them to use VSS and start a weekly training meeting that is optional for learning new techniques and tricks ... addressing issuess ... it has worked pretty good ... except for where they would follow an article in gartner rather than take real-life advice from people who have had experience in this new world (to them). Ok enough rant, that's just me but I'm sure the same scenario is out there ... :) So sadly I can't change jobs and expect to outrun this environment ... there are those who are just there 8-5 and not a second more because it is their job ... on the weekends they spend going out with friends i'm at home reading new articles trying out ideas ... learning ... not because i'm better than them in all things but i have the drive to progress ... the feeling of not yet reaching my maximum potential ...
Just for arguments sake, it *can* be done pixel perfect. Make each page a jpg or gif image! lol
Yes I get this all the time. My current role is pretty much making sure the development teams do things that make sense. We also do code inspections. This is not ideal as it's usually too late in the process to have them change their code. Basically I think it comes down to someone's attitute to learning. If they are not interested in learning, then they won't be good programmers!!
A good company with few layers. Only 2 layers between "Consultant" and "Principal." I work in a consulting company. :)
I would agree that management makes all the difference in the world... Since you know where I work, I think you would agree that our management makes it very easy to enjoy working there...
<disclaimer> I don't know ANYONE posting comments in this section (to my knowledge, anyone can be anyone else on the internet) So I don't know if you can back up your claims of greatness or not. </disclaimer> But you always have to be careful if you think you are a big dog because there is always a bigger dog. I've been coding for around 10 years, playing with computers since acoustic modems were new, probably just a pup compared to some people posting comments here. I've dealt with a lot of prima donna coders, some I was more skilled than, some less. Most coders will always think that they are a better coder than someone else, or that they KNEW the correct way to write an object or method or function. Sometimes there is a better way to do it, sometimes it's just different. Every good programmer I know always thinks they can tweak a little more performance or make a block of code more elegant. I've written code I'm not proud of and that I think I could architect better, hell I'm writing some at my job now. But it's getting the job done and my deadline is "yesterday". You may think the code stinks to high heaven, but it may get the job done. And whether or not you are coding for fun or for a paycheck, at the end of the job you have to SHIP.
Hahahahaha
SHIP !! That's just the sort of attitude that is at the root of the problem. What a terrible reply !
There is always a bigger dog, and the code can always be better. I'm going somewhere where I wont be the big dog, just one of the medium dogs. This is good, because I realy am a medium dog (with the potential to grow). I know more today than I did at the start of the day yesterday. I didn't know the best way to do it, but when you look at what I did, you will say "he did this because he wasn't aware of the ABC123 pattern". Shiping the product is not really the end of the project, you also have to fix the bugs when they come in.
The failure of every project I have been on can be traced to poor management. In only once case was the technical aspects so poor as to cause failure (but the project failed because of management before we got to that technical failure point).
>But you always have to be careful if you think you are a big dog because there is always a bigger dog. I don't think I claimed to be a "big dog", but I will claim that I have lots of experience and can tell the difference between good and bad code. > I've written code I'm not proud of and that I think I could architect better... Agreed, but why do we do that to ourselves? Someone will have to fix/change it eventually. We coders give ourselves bad reputations when we let management bully us into more and more features with less and less time. Coding crap just to get it done is not the right solution in my view.
no, that still won't work ... if it's just a JPG or GIF, you still have the margin issue
My big experience with lazy programmers is that I've worked with LAZY PEOPLE, employed as progammers. They wouldn't want the endless paperwork, support calls, forced social interaction and mundane manual processing that lousy apps deliver, so they'd bust their butts on building something really solid. (Of course, I'm assuming such is a rarity.) Another true lazy programmer I supervised a few years back lent his own scruples into hs design - specifically, being wayy too lax with minor details. On a web project, when we had to store files in a folder, he'd think this was below him and just randomly hit 29 keys on the keyboard without looking, to generate some stupid name for a subdirectory that neither myself, nor he, could find.
I added unit tests to my data access layer, mainly to get notified when the DBAs would surrepititiously change parts of the data model and not notify us. It worked great. After it was installed they would get beat up in the project status meetings instead of me. :)
xyz, You are absolutely right - "SHIP!" is a terrible attitude. The problem is that it's the attitude of many managers. How many programmers are eager to cut corners and release stuff before it's done? Not many, I'd bet - they are the ones who'll have to deal with all the bug reports, after all. In my experience, programmers cut corners and write sloppy code because they are struggling to meet unreasonable deadlines set by incompetent managers. It's a sad fact of life, but you aren't going to get anywhere by blaming the programmers in this situation.
I once worked massive hours of OT on a project. 5 weeks of 6-day a week work followed by 6 weeks of 7-days a week, followed by 2 days off for Thanksgiving, followed by more 6 and 7 days weeks, up to and including missing the company Christmas party because I was at the client's office until after 9 pm that Saturday night. The carrot for me was a large bonus that was coming at Christmas and had been promised for over 6 months. The bonus never came but excuses were given for about a year for why. After that, the bonus magically turned from "just not possible" to "never promised". needless to say, I didn't stay with the company very long after that. It has been hard for me to trust anyone regarding money after that.
Have you looked at writing acceptance tests before implementing the story? I know at least one project at Thoughtworks is doing this, and we're trying to get at least some form of acceptance-driven development going on our project. It can start off with simple scripts hand-written by testers, then these can be automated when people get pissed off enough with a manual process. One big problem for us is that good acceptance-level testing tools for .Net are very thin on the ground. We have yet to find a decent solution to fully automated GUI testing, for example. Jim
In this project the acceptance tests are written either before the story is started, or at the beginning of the iteration. We had a full testing team that was doing their best to figure out agile testing.
RE: GUI Testing We were using Rational Robot and some custom built tools. We didn't use them for acceptance testing, but rather as a smoke test.
Trust is a big issue. I worked on one project where our team trusted management (the technical side of mgmt, anyway), and everyone on the team worked their butts off, willingly. Then, through a series of mismanagement actions, we became aware of how our technical managers acted under pressure. Basically they caved in and kept asking us to give more and more. So we gave less and less as the trust eroded. And, due to a convenient reorganization, no bonuses were handed out. Needless to say, I eventually left the company. But not before having them pay for all my certifications and a bunch of technical books!
Too often this "motivation" is needed to solve the following situation. [rant] 1. We told you it wouldn't happen 2. You promised the client it would happen. 3. We have done what we said could be done, but you never told us that you promised the client what we said couldn't be done. 4. You are blaming us, and you need us to pull your ass out of the fire. [/rant] Trust is a big issue, and the "motivator" person is not really on the same team as the rest. The task will often be given to the least useful, least respected person on the project.
I've just been through a situation which was very similar. A tender requiring a response came out from a customer a week prior to Xmas. We had 7 days to respond (including the weekend). Some members of the "team" said "I do not work weekends." Others said "Let's get it done, whatever it takes." Some said "I'm not working while I'm on leave." Others said "I'll postpone my leave a week" or "hey if you only need an hour of my time, to go over a document, no problems". Why the difference? I can't tell. I think it is an internal thing. When money and prestige aren't involved, people just do things because of how they are wired. I haven't worked with many people who can motivate others to do what they do not want to do. All you can do is give people reasons to do something they may not have thought of by themselves. BTW, I have twins and young twins at home is a reason to work LONGER hours, believe me. :-)
No-one seems to have mentioned the thing which probably gets a lot of us out of bed in the morning - a love for what we do. I work as a developer because I'm passionate about developing. That's my motivation. Put me in a job as, say, an accountant, and my motivation for doing that job would be very different. I might still try to do a good job for the sake of personal pride, or the promise of more money, but I wouldn't be passionate about it. Love is the answer :-)
Early in my career, I would "sign up" for lots of stupid overtime, crunches, pushes to make the date. I postponed vacations, dates, and all kinds of other social events to "give my all" to the project. One day, I realized that working all that overtime just made me stupid and that I couldn't save the project. Now, when a manager thinks that the answer to the project being in trouble is to add more hours, I ask him/her to think instead about what they can remove from the project to meet the deadline. The project can't complete as originally promised, so stop trying to make it that way. Instead, work like the devil (during the normal work week) to complete what you can. Sometimes my clients even do what I suggest :-)
Spot on! There are way too many of the “Programming as a Job” developers around. I think the fact that so many people in this industry refuse to improve themselves outside of the 9-5 workweek cycle is a major hurdle to creating quality software. In a field that moves as fast as this, one simply cannot afford to stop learning. I look at what I did last year and I realize that it was not the best work I could have produced, BUT I have not stopped reading and learning and I am getting better every day. The best motivator I have seen for developers is success. Even if the creation of an application has some rocky times, all is forgotten when the product ships. I look back at the times I felt happy to work in a company and they all center around having successfully delivered a quality product on time.
Well, I have come across this most disturbing phenomena and must say it is driving me insane. I am trying to create a set of "globally" accessible variables from within a page, and any user controls it contains without having to pass the variables back and forth betweent the calling page and the user controls each time. Any Ideas as to how to make this happen, as using the public keyword seems to automatically make them static no matter what I say and screws up my pages between requests.
Global variables...What a subject! I'm currently working in VB6. I'm sure that there are times when a global var is better, easier to use than a local var that must be passed from one procedure to another to another...What a mess. When I find that I'm on my 5th proc or so I usually declare the var globally. I name the vars with gl prefix (global, long) so I know what I've done. Rather than "Don't do it." I'm looking for instances when global vars are best.
> thus testing the domain layer as a result This domain layer is limited by the UI, where FIT would not. Useful if testers want an alternate arena to test (compare?) limits in there own creative (tabular?) space, but not if they're simply looking for system validation. I agree that FIT's an augment not a replacement.
Bad code is due to a couple of reasons... 1) There are sloppy and lazy programmers out there who are just bored or otherwise uninterested in there jobs. Why can some mechanics fix that noise when others can't? 2) MANAGERS and unreasonable DEADLINES. I dont know about any of you but I am never done with a project. I am picking through code up untill the very end, and even then it is never done to my liking!
Any chance of posting a binary for this project? I have added myself to the project and grabbed the source from CVS but piecing together the references and dependencies without a project file is a little tough. Nice to see this work is progressing! Well done.
http://www.sqldata.com/soapclient/soapclient30.htm
Most people write bad code for several reasons -- be it a bad design, insufficient knowledge, boredom, or plain simple stupidity. However, from what I have seen, programmers who think through the problem before writing even a single line of code, code better on an average. Also, programmers who can think of programming without associating it with a language do write better code. These are the folks that think in terms of algorithms before thinking in terms of code.
The source has been updated. See http://weblogs.asp.net/wallen/archive/2004/03/10/87421.aspx
If you're looking for updated Vault tasks, go visit Brian's site. He has Vault tasks that work with Vault 1.x and 2.x and NAnt 0.82-0.85. They're available here: http://www.schkerke.com/nanttasks.html Also, if you're interested in Draco.Net integration, I have some code to integrate Vault w/ Draco.
Very interesting experience report Wayne. You should consider turning this into an article.
I am working in a big company, with lots of projects. When the job is handed out, the deadline is also a few day's or a week. The people who handled the projects must finished it but the boss is never around.. The day when promotions is in line the people who support the company the most is not in line for promotion. You can checked it, 95% it is people who stayed away, 2 time's a week on sick leave. Thank You very much
Thank you. I find this very userful.
I love it :) "Yes, this is an horrible user experience. Why? Well you see, it's ok in other, completly unrelated industry and you accept it, so that's the way it is for us too." This is the worst possible excuse I have heard in a long time :)
your computer slows down after time? Hmmm. strange. my box has been up for the last 2 weeks no problem. running winxp pro, and the board is designed for servers/workstations, but its still windows xp pro. also, mobile technology in the US must not be as good as here in Europe. my phone has been on for, well i dont know. nobody wrote an uptime app for my phone! but it hasent been off in a long time and its grand. i sit in work for 8-9 hours a day, more then likly on the same cell site, and at home for an other 12 hours or so, also on the same cell site, and no problems there. weird!
That's just plain crap, staying in 1 cell makes you unable to receive calls... My phone travels max 1km distance so I guess it's always in the same cell, and it hasn't been turned off for the last 5-6 months, and I always am able to call Call them again, be angry, demand an explenation and to get it fixed, you're the customer. I find his responses rather rude :/
I work in Ann Arbor Mi and I had the same problem with my T-mobile phone. The signal is a little weak here too. I took it back to the place I bought it a couple of times, they opened to back up and re-set the chip - It didn't help. Then one day I made a discovery. If I don't clip the phone to my belt (or place it in my pocket), the phone works fine. (I don't have to turn it off and on periodically like I used to) I keep it about three feet away for me on my desk and I no longer have any trouble with it. Don't know if this will work for you, but I thought I would mention it.
They had "server trouble" and stopped sending out keys a while back. All their customers got ticked off and filed complaints with paypal, who apparently has suspended his paypal account. Most likely, he is busy with legal trouble now from all the people that they ticked off and trying to get paypal to reinstate their account. In any case, I always thought C# refactory was a piece of crap. JetBrains should be releasing a decent one soon. You ca