I have created a home for MadCMS at java.net. Here is the url: http://madcms.dev.java.net/
The project will be run from there, including mailing lists, source control and bug tracking. Let the games begin!
UPDATE Ooops... That URL won't be available until after the project is approved by the Java.net admins. I will post again when it has been approved.
The family went to the Smithsonian Museum of Natural History. Snore. Basically one long biology lesson. Snore. *chuckle* We are going to one of the art museums tomorrow, I know that will be much more interesting. I think I may be losing geek points for enjoying art over biology, but I like art. We were going to try to get into the Air and Space museum, but the line was to long (~45 minutes to get INTO the museum). That would have been a fun tour. Hopefully I have made up some of those lost geek points now :-)
Merry Christmas! I am having a great year, and I hope you are too! This year, my father and brother came down from Michigan and my sister and her family came up from Georgia. We played cards last night and opened presents this morning... typical fare. Kids hoorahing and siblings ooohing, with a little bit of drooling coming from the younger crowd. We are about to trek to the theatre to catch the third installment of the Lord of the Rings.
Happy Holidays!!!
Wowsa! I called this one back in October. Joel is releasing a new FogBugz for Unix. This is very exciting and I just may have to re evaluate my love for JIRA. Lack of a wiki isn't really a killer, but FogBugz wins points for close integration with CVS. Way to go Joel!
I said something like this just the other day. Aparently Microsoft thinks email is lacking when it comes to conversation threads and has been researching it for a while. IBM has been working on a new email client called ReMail that has some very cool threading ui. If they ever release it, I will definately give it a try. For now, I will just have to settle for some extended reading.
This morning when I awoke I had a brillliant idea. One of those mad scientist type moments where you finally figure out that problem that has been stewing for the last month. That was the genesis of MadCMS.
Currently, you can create Pages which are made of Plates (currently being called Content). You arrange each Plate in the order you wish for them to appear in the Page. Each Plate is allowed to have one query, which is pure SQL. The ResultSet is pushed into a Map which is then pushed into a List and cached. When you call the Page it grabs the Plate from the DB and then if it has a query it uses Velocity to put the data and the Plate together which is then pushed into the Page.
Technologies used: Struts, Jaxor, Velocity, and JSTL
Download MadCMS and give it a try and let me know what you think. Beware though, this is very much Alpha quality. Not bad for 10 hours of work though.
I think it would be good to have a blog where fellow developers could post and would allow the team to track the progress of a project. This idea is not original and has been covered by others, but I thought I would cover some of the tools to make it happen. A couple of tools: CVSTrac, Jira/Confluence, SnipSnap, XPlanner and last but not least... Groove. What about email? I am not a fan of using email as a communication medium for development because messages are not always threaded together appropriately and linking between messages is not easy. Linking between messages in a blog or wiki is very easy and allows the conversation to ebb and flow while maintaining references back to original ideas.
Notice also that the blogs/wikis (or blikis) that I mentioned above are also connected to some sort of project tracking device as well. (all except SnipSnap) CVSTrac's integration with CVS is better than all of the others. Jira/Confluence is a great project management tool that will become an industry leader. SnipSnap is just a cool blog/wiki tool that is Java based and easy to set up. As a matter of fact, I have it running as a service on my personal computer to keep track of things going on in my life. It is an uber notepad. XPlanner is an XP specific project management tool that has a wiki built in. And Groove is what Lotus Notes should have been.
If I had to pick one, it would be Jira/Confluence. Even though Confluence is still young, I think that combo is the way of the future. Jira is by far the best bug tracking tool available today. The painful part about picking Jira over CVSTrac is the loss of CVS integration. CVSTrac hooks your checkins to your bugs and vice versa. It also keeps very good records of your checkins. Having the ability to create your own reports has its perks as well. But CVSTrac just needs improvement in so many areas that it can not be used exclusively. FogBugz would be interesting if it wasn't Windows only, but alas, I refuse to run Windows as a server so FogBugz doesn't even get to compete.
One could also make an interesting defense of using multiple selections from above. CVSTrac to manage your cvs users, browse checkins, and browse the files themselves. Jira/Confluence for bug tracking and project blogging/wiki'ing. SnipSnap would be used for personal blogging/wiki'ing. And Groove for those times when you need to "share".
Just a thought...
Jaxor - Code Generator - Cool, crappy docs, but getting better
iBatis - SQL Mapper - Cool but lacks dynamic loading of child entities, great docs
Torque - Code Generator - Good, but a real pain to generate code, less than good docs
Hibernate - Reflection - Everyone's favorite reflection based persistence layer, great docs, great support
I started down this path of discovery last year. I started off with Hibernate which quickly left a bad smell in the air. However, since there were many people saying it was great and it actually looked great, I gave it a second and third try. I was never won over. One of the problems is the re-invention of the database query language. There is already one good one called SQL that most people use. Having to learn another one just doesn't make sense to me. Also, debugging was very difficult because of the reflective nature of Hibernate.
Unhappy with my experience with Hibernate, I sought out a new persistence layer. I happened upon Torque while researching some of the Struts committers. I built an application to test out the functionality of Torque. The fact that I actually could be productive with it (which I never achieved with Hibernate) was very positive. Although it was easier to debug because there were actual classes, actually creating those classes was painful, and including those classes in my project wasn't easy either. This left me grumbling and wishing for more.
At this point things were a muddled mess and nothing really stood out. A couple of my mentors were trying out different frameworks, but no one was really happy and Hibernate was gaining steam. Still frustrated from my previous experiences I avoided it and continued with Torque.
Then, a friend introduced me to iBatis. Easy to configure, great docs, not a code generator, but easier to debug than Hibernate and uses SQL to query the database! I started writing tests and the development was fast. If I ran into a problem the docs were there to help me out. Then, I ran into a problem that was not going to go away. iBatis does not handle nested lists of child objects. As a matter of fact, it can get to the point where it is issuing a new query to the database for every object in a list. This "feature" can quickly turn into a terrible performance hole if you don't know what you are doing. Even with this nasty little "feature" iBatis was still the persistence layer for me.
Then, I started doing something that always causes problems... I started reading. This time I picked up Martin Fowler's Patterns for Enterprise Application Architecture. I started reading about Data Mappers, Foriegn Key Mapping and other Object-Relational Structural Patterns. I was sold. My hero iBatis had been felled by a better idea. I started thinking about how I would implement these patterns into a package. Then I found Jaxor.
Jaxor doesn't have the docs of iBatis or the popularity of Hibernate, but it does have the favor of a couple of smart guys that I really respect. So, I started writing tests and bumped into a couple of problems, these were raised to the mailing list which quickly caused documentation to suddenly appear on the web site. Excellent! Docs are a little lacking, but the technology is there. Jaxor is fast and strong and easy to debug.
So, for the time being Jaxor is my persistence horse for now.
I was roaming town around with my friend Cris today, and we happened to stop in a nice little art gallery. The nice lady in the gallery was trying to let us know about the artist featured in the gallery. She said "We are featuring some new French impressionist artists from France." Now, I am not an art expert, but usually French impressionists... come from France.
Cris must have been smoking something this morning because later he dropped a nice little sentence on me as well. "I went down to the floor to meet Miami." Which translated means "I went to Florida to visit Adam." I had a good laugh about that one as well.
Needless to say, everything since the gallery has been about French things from France. Not Italy or Spain.... Just French things come from France. Over all, it was a great day.
I wish I had read this article a year ago. I think it would have helped me deal with some of the developers on my team. Anyway, it is a good read about how it really takes ten years to become a proficient programmer. Not something that can be accomplished in 21 days. I think many people know this as "a truth" but are not able to express it in a way meaningful to the common joe. Mr. Norvig pulls it off nicely.
Erik started it. Charles has his own version. My dad is sick, my oldest son is sick... and now I am sick. I hate being sick.
Being the middle man sucks. What sucks even more is being the first middle man in a chain of middle men. My server went belly up, again. This time, my admin got pissed and said he didn't want to do it anymore. So, I found a new ISP and got the process rolling on switching over to new hardware. In an effort to make things easier on the users, I ended up making them harder and possibly costlier. Actually, everytime that I tried to make things easier for the users, something went wrong.
Back to being the middle man... So, a customer has a problem, I depend on other people to fix the problems, so I call up my new admin and let them know what needs to be fixed. They call up the old admin and ask them to do something and 4 hours later, we have the problem solved. Unfortunately, that was one of the quicker solutions. We have had some problems for two weeks now. The issue is, we find out one thing is wrong and fix it which leads to another issue. But for each of these issues, which all take in the neighborhood of 5 minutes to fix, we have to go through this whole chain of middle men.
Of course this would all be much easier if the two ends would just talk to each other, but the problem with that is there are really three ends and none of them speak the same "language". Having a real user talk to a real engineer just causes the engineer to curl into a fetal position and makes his eyes to roll up into his head. One solution would be to put the fixing end (engineer) in the position of being a user. That way, the fixer would know IMMEDIATELY that an issue was found and they could fix it.
Lessons Learned:
Lots of pain for a little while is better than a little pain for a long while.
Make the maintainers of a system actually use the system.
User's drive me up the wall. If you are building them a new system, they only want what they have seen on other systems. They don't think outside of the box, and when a developer suggests something as outlandish as "allow the computer to do some of that work for you" they freak out! "But we have always done it that way! What will we do?" Hopefully, you will look for other ways for our company to make money instead of the same old boring job you have been doing for the last 15 years.
I am going to go out on a limb on Monday... There is a peice of functionality that I consider "low hanging fruit" that I want to implement, but no one has asked for, but everyone will love once it is there. I have done this before... It is a pretty interesting story...
I was working on an operations floor, swapping tapes out of big IBM iron for the daily backups. That was my job, tape wrangler. During the shift we had to log everything that happened during the shift. The log was written in a special format so a nice little Perl script could rip that log apart and create a report for the big wigs. This was all before the Internet exploded, or web interfaces were "cool".
There were about 40 steps that had to be taken to change our log into the report and then email it out. One night, I looked at a linux box that one of the guys had been playing around with and a plan started forming. Over the next couple of shifts, I would write some code and test things out and see how my little plan worked. Sure enough, I turned our 40 step, 45 minute process into a 5 step 15 minute process and it only took me 8 hours to make it happen. I presented it to my shift leader, like a proud pappa. He was impressed and we started using it over the next couple of shifts to see how it worked. It worked like a champ. I was saving us 30 minutes a day.
The next weekend, we were turning the shift over to the weekend team, which was being managed by a real stickler for policy. I don't remember how he found out, but he went berserk. How could I waste precious time writing some new fangled script that might not work? Did I get approval for it before starting? Who gave me authorization to change a procedure that was part of the SOP?
I won't bore you with the details of how he spent the next week trying to get me demoted, reprimanded and punished. I will just summarize it like this... His complaints got up to the director of our division, who saw it the same way I did, I was saving 30 minutes a day that could be used to do something much more productive. The 8 hours that I had "wasted" over 4 days, during the midnight shift when there was NOTHING else to do had already been made up through the use of the script over the last 20 days.
I was looked upon as a rebel from then on, but was soon taken off of the operations floor and asked to revamp the help desk system. It seems their software was not doing what they needed it to do. The manager was never taken seriously again and soon moved on to another location. My shift leader now works for Cisco and has a CCIE. And here I am... a lowly developer trying to foist my ideas on unsuspecting users. I guess I have earned my rebellious label.