A network of sites, tools, and technology to bring ideas into reality.

The Digital Tumbleweed

Thoughts and ramblings of an enthusiast

Choosing Your Tools and Solving Problems

In any project there comes a point in time when you think to yourself, “This has probably already been done before.” If you don’t get that then maybe I’m just weird, but I prefer to not have to reinvent the wheel. There are plenty of intelligent people out there who must have had this problem before, and if not…then why is mine different?

The Wheel?!? Oh my.

So you’ve decided that you need to use someones library. You’ve been searching and found many around. Great. That means you don’t have to spend the time to develop the solution yourself. In this case, you’ll want to pick the right tool for the job. But, how do you distinguish which is better? You may be thiking, easy, just pick and go. But, if you’re building a product, this decision can be crucial. It can affect many peoples time. So, again, how do you pick the right tool. While each situation has different dependencies, here are some of the things I use to decide.

What is the barrier of entry? In many cases I’m not going to be the last person to touch a piece of code. And, on top of that, the next person to touch it will be in maintenance/bug fix mode. So, I want something that is easy for someone else to jump into. This mostly means API. While there are a few other pieces to this that I’ll explain later, API is what you will use inside your code. Thus, someone coming into your code should be able to make sense of it without having to ask you all the time. So, the library should be easy to learn.

What is the community like? This is a very big factor in the decision because, like above, if the code is not easy to understand or if I suspect that there are issues with the library, I have the ability to find out when the community is large. This doesn’t mean that small communities are not helpful, look at the Axiom Stack…Small for now, but staying active on the forums. Is there some excitement? Is anyone talking about the library/tool?

Are you trying to sandblast a cracker? Every engineer goes through the phase where s/he architects for the moon. This is a bad thing. Using Dojo or ExtJS to alert some information to a webpage is sandblasting a cracker. Getting a backhoe to pick up dogcrap is sandblasting a cracker. Building a $4000 machine to play Pong is sandblasting a cracker. The point is, don’t overdo it. Pick something that is going to work for your problem, but that wont hinder performance, decrease everyone’s productivity, and cost a lot in the long run. You want the gains to be greater than the cost.

What is the quality of literature available? One thing I’ve noticed on the Django site is that the documentation is phenomenal. Not only do they have a 20+ chapter book detailing A-Z on Django, but they have their API documentation as well. While the API docs could use some sprucing, the information available is incredible. This is the same for ExtJS. The documentation is very thought out and appears as though it was a focal point in the development process. To add onto this, are there any hard-copy books available. Java has numerous books available. This makes it easier to find quick answers or to learn something from the “experts”.

What are we, neanderthals?

This is the time when you’ve searched. You find nothing. Not a single result on Google. You check to make sure you didn’t fat finger the search query, and still nothing. Well, it’s time to break out the red bull and prepare for that all night-er right?

Stop! It’s hammer time. First, before you start writing any code, rethink your problem. A lot of times you’ll create problems that don’t exist. By this I mean, you’re attempting to solve an issue that isn’t there. Another common situation is that you forget about the overall picture because you’ve been staring at the same problem for 15 hours straight. Take a break and come back to it. It may be that the problem you thought you had is a bit different or that there is a slightly different way of thinking about it. By removing yourself you allow your subconscious to process it a bit before returning.

Use your brick wall. In almost every programmers toolkit exists a brick wall. This is not for slamming his/her head against it. Instead it’s a person that s/he trusts to bounce ideas off of. Quite a lot of things make sense in my head…it’s unfortunate that those things don’t always pan out in reality. Thus, the brick wall. If I can bounce my ideas around a bit I’ll come to a better solution. Even if the person I’m talking to doesn’t say a word about what I’m talking about.

Buckle up. If you’re confident that you’re problem exists then it’s time to hit it head on. In the words of Rands, start! If you wait around trying to contemplate the issue, you’re just wasting time. You’re confident that you have an issue without a solution, so dive in and start hacking away. Use some common sense when you are solving this problem. If you suspect that the problem may need to be solved again then start making your own library so that others can use it.

I always find that taking a second to think about my problem and then bouncing it off the brick wall helps whether there are tools or not. But, I really find that the community can make or break my use of a library. The collective minds of others is a great thing to have.

Useful Emacs Modes

M-x flex

One thing to keep in mind is that while I use and love emacs, I think it’s important to have an editor you like and are comfortable with. Whichever is up to you. I have heard many-a-thing about many-an-editor and I don’t care to be a missionary for emacs so what I will say this; use an editor that you are comfortable with, but that is powerful. One that allows you to modify the text on your screen in a few simple keystrokes. The two main ones that come to mind here are emacs and vi(m). But, if you can make Notepad++ or others do this, then enjoy. You will never know everything there is to know about your editor, however you can strive to become a more efficient user. When I made the switch from TextPad to emacs I cut down my coding time by probably 20%. Thats huge in the grand scheme of things. If you think about the number of hours I work, and take 20% of that, you’ve freed a huge chunk of time I can be focusing on other things like YouTube and Facebook. The productivity gains are wonderful. ;D

Since I’m an emacs guy I’ll talk about a few of the modes that I am really keen on and how they help me or _will_ help me based on my experience with other modes.

js2-modeJS

As you saw with my post about the Axiom Stack, I tend to do some JS development. I’ve made due with some JS modes and tried to find something that I liked but this one seems to take the cake. One thing that has irked me about other JS modes for a while is their lack of understanding of the regexp. When I throw a regexp in there and use something to the effect of str.replace(/\’/g, ”) the mode blows up and I then lose all syntax highlighting for the rest of the buffer. js2-mode fixes this. *WOOT*

Yagge wrote this mode as a direct port of the Rhino code. That means that there is full JS support up to JS 1.7. Can you say list comprehension? I CAN and js2-mode can see it…therefore so can you! :) Eventually his hopes are to turn this into something that can function much like IntelliJ or Eclipse. As a start, he’s really gone beyond what I expected when my friend at zen-hacking.com pointed this out to me.

The indentation is a bit wonky but true indentation is a complicated feature to include. There are a number of things that people “prefer” making indentation a very difficult task. However, I can only see this feature getting better with time.

I’ve been using it since it came out and am very impressed. Just starting out it surpasses the other JS modes out there. I recommend giving it a try.

You can find this mode at: http://code.google.com/p/js2-mode/

yasnippet

Today, my friend at zen-hacking.com stumbled upon a mode called yasnippet. This is a snippet mode if you couldn’t guess it from the name. What does this mean? You can stop having to write boilerplate code. Instead, you type something as simple as “class”, then tab, and the boilerplate appears before you. This mode adds another feature that is found in editors like eclipse. Also, it’s scalable. As it stands, there are a number of modes already handled such as cc-mode, python-mode, and ruby-mode. But, should you write a language for your day-to-day operations, you too can build snippets of boilerplate. Check out this video: http://www.youtube.com/watch?v=vOj7btx3ATg

You can find this mode at: http://code.google.com/p/yasnippet/

hippie-expand

hippieThis mode is a very useful mode for helping you code faster. How so? Hippie-expand records the things you’ve previously typed and, with a command, will expand whatever you are typing into what it matches. This is extremely handy as it cuts down on the amount that you must recall at the time of typing and it cuts down on the sheer amount of typing that one must do.

I think the obvious point here is that with this mode you become more productive. You can focus more on the algorithm or problem at hand and in coming up with a solid solution, rather than having to focus on remember what that farkin’ variable name was. You can just type the start of the word and then whatever key command it is and you are scrolling through your set of variable names.

You can find this mode at: http://www.emacswiki.org/cgi-bin/wiki/HippieExpand

Fin

No, this isn’t a mode. These are three of the modes that I use that I find to be extremely helpful. What modes do you use? Two that I would like to get working better are Remote File Editing (tramp-mode) and Version Control (vc).

Axiom Stack: The Personal Edition, Launched

With the multitude of web frameworks out there, picking a good one can be very tough. Hopefully I can help you pick the Axiom Stack. You wont go wrong with that choice. You can find it at: http://www.axiomstack.com. I would highly recommend checking the site out and reading through their documentation. It will help you understand things that I’m going to skip here. I’m not writing a tutorial, yet, just outlining the features. :) The Backend/Database Layer

Axiom natively runs on Lucene. What does this mean for you? You have built-in search. Instead of being required to write sql and logic to get resulting data, you pass in the fields you want to search and the term you want to look for. The Axiom guys have also enhanced the Filtering system too. Now, the thing thats keen about this is that they realized that people currently know RDB’s. So, they have the built-in ability to use a relational database straight through the stack assuming there is a JDBC driver for your database. Also, you can utilize the power of both systems at the same time. You can have objects built that are Lucene based, and objects that are RDM based. It’s extremely handy when you have data already stored in other databases that you really would prefer not to migrate (migrating content is a pain…I know first hand).
So, you get some nice data storage services right off the bat.

The Middle Tier/Logic Layer

This layer is by far the most interesting, only because there is so much going on here. You have the ability to write Javascript on the server-side. Thats right I said it, Javascript on the server-side. Fundamentally, all you have to do is create a JS file, dump that into a folder and BAM, you have server-side logic.

The way this works really works is through prototypes. Javascript has a funky way of representing objects. The way it works is through prototypes and the same notion is used here. To create a concrete understanding of the separation you first create a directory in your application. That directory now defines your prototype. The next step is to create a mapping of the properties. This mapping tells the Axiom backend code how to set the datastores up. Then you create a JS file or a few. The JS files are loaded together, so be sure you keep your naming as accurate as possible such that you don’t clobber other functions. If you think about it, if you write a function called getMe inside your prototype definition, and then later do something to the effect of o.getMe = function() {}, you’ve overwritten the original function. So just be careful about naming. I tend to break my functions up by files such that the functions in a JS file all do similar things such as rendering to the screen, macros that happen all the time, etc. The only function you need to be absolutely concerned with is the main method. This is the function that is called by default when you request and object.
It’s extremely easy to create objects in Axiom. You don’t have to do much. Now, if you really want to enhance the functionality you have a great many things you can do. Not only is e4x available (with full xpath support), but all the features of Rhino. This includes list comprehensions, WOOT!! I’ve loved using list comprehensions in python and the fact that I can use them in my Axiom code, even better! So, beyond this there is the whole LiveConnect thing. LiveConnect enables direct access to Java classes and methods through the Javascript. So, if you are finding that the Javascript really isn’t suitable for what you need, or that there is a library out there that already does what you need, you can use the Java code to make it happen. It’s pretty sweet. I’ve dabbled with it and use it for a number of things.

Now, you may have heard of Aptana’s Jaxer server allowing you to write javascript on the server-side while having full DOM capabilities and such forth. But, what you have to do is write html tags that tell the Jaxer server what to run and what not to run. While alright, it doesn’t lend itself to real extensibility IMO. Why do you want to have to riddle your presentation layer with server-side specific tags and code? What happens if you need to change something? Are you forced to change it in both locations? It doesn’t seem practical to me.
With Axiom, the request comes into the server, the server takes the request. If the request is to an object then the main method is used and then processed. If the request is for a method on that object, then that method is processed. This means that you are processing the methods before the templates giving you a lot of flexibility with the kind of data you want to send out. Now, what is a bit tricky here is that the templates, i haven’t gotten to these yet, are considered to be functions which I’ll get into a bit more later. The reason I bring it up here is to point out that you can, should you want name a template such that you can request it from a URL. So, if you have a very basic template or something that doesn’t need the Javascript processing to display it, just name the template what you were going to name the JS function. :)
The Front-End/Presentation Layer

The frontend is all about TALE. TALE is a proprietary templating language that was developed by the Axiom people. It’s really very simple and that was their intention. There are a handful of directives you can use, and the directives are quite simply just attributes on XHTML elements. You can think of it like XSL without the suck. What I mean by that is that it is not clunky and overbearing. It doesn’t introduce insane amounts of extraneous code into your template just to get logic to work; remember, the logic is done in the JS. The templates allow you to manipulate the XHTML output based on the data you pass into it. A cool element to TALE is that it natively parses JS. So, you can use simple JS to gain access to your information.

To add the last element to your prototype, you create a template inside the prototype directory. This file is now a template for any objects of that type. So in the template you can use proper scoping such that you get access to an objects methods and properties. “this.someFunc()” will look for the someFunc method on the current object. It does that naturally in Javscript, well, you also have that available in the TALE.

My Thoughts

Axiom is a great tool. It provides a ton of functionality and some awesome features that you wont find elsewhere. You’ve got a number of create technologies that have been used with it. And, if you find that you’re missing something, you can write a Java lib or use one to enhance your experience. Really, this does up the ante for other web frameworks out there. It raises the bar. I highly recommend using Axiom as your platform. While the community right now is fairly small, it is active and the people involved are highly knowledgeable about it. Check below for some extra links for good reading.
Some extra links:

Good Engineers…Where?

Today I decided to take a stroll through some of the blogs I like to read up on and saw “Undergraduate Programming” on joelponsoftware.com. Joel’s post was to discuss Computer Science Education: Where Are the Software Engineers of Tomorrow?”. I decided I wanted to comment on this as it’s been a recent topic of discussion with some friends and myself. The real question is, “Where have all the good engineers gone”?

Computer Science Education

While I can certainly say I was satisfied with my undergrad in Computer Science, I do wish I had more training in theory and algorithms. To be perfectly honest, these are the elements that are crucial to a true CS understanding. I’ve also seen a number of people both in jobs and looking for jobs, in school and graduating, who are supposed to be the Stallman’s and Torvalds’s and it seems to me that people just don’t have the same understanding that people who were educated in this field had a few years ago. I think the article makes an excellent stab at trying to pinpoint the reasons.
Computer Science programs all over are dumbing down the curriculum’s to attract students. The problem with this is self evident. If you’re program doesn’t teach as much and isn’t teaching the theory then how do we expect the students to really provide the innovation and software of tomorrow? In fact, the article points to this quite well.

The resulting set of skills is insufficient for today’s software industry (in particular for safety and security purposes) and, unfortunately, matches well what the outsourcing industry can offer. We are training easily replaceable professionals.

However, I don’t think the introduction of Java is to blame for this. The reason being that the same theories and algorithms can be taught in Java based courses. The issue is that the programs are not challenging the students enough. The courses don’t push students to the edge of their mind. Also, students aren’t pushing themselves (we’ll come back to this trend). A number of courses I’ve seen consist of the code being spoonfed. By holding the students hands through wading in the kiddie pool we are really just setting those students up for failure when they are tossed into the shark infested lake and expected to be able to walk on water.

Now, back to students and lethargy. When has it ever been acceptable for people to expect that they will be coddled? What kind of future will the field really have if people don’t discover on their own, try new methods, read new and old theories to better their abilities as developers, innovate, or think critically? People seem to be extremely apathetic towards bettering themselves. I don’t know that this is distinctly seen in the software engineering field or if it can be seen elsewhere as well. But it seems to be a major problem. Unfortunately I don’t know that there is a fix. People do not simply change how much they care about something overnight. Thoughts? I feel that this trend has and will continue to lead to the decline in truly competitive software engineering.
To get back on point; there are issues with both the education system and the people attending these systems. But I think that the guys in the article are on the right path in that, we can’t dumb down the courses taught. In the courses I took at college we were expected to write the libraries ourselves _before_ we could utilize the ones provided, all in Java too. Java should not be taught starting with a GUI, this is not Visual Basic folks. Instead teaching OOP constructs, which helped me to fully grok pointers and other C constructs, teaching the threading model, etc. are incredibly useful tools for developers.

A language is a tool in the toolbox of a developer. My friends and I have this conversation consistently, no developer should be so keenly attached to a language that “that is how I program”. Instead they should see where a language provides the best solution for the problem they need to solve, and then use that language to solve that problem. And, to be fair, the authors make this argument as well.

Real programmers can write Fortran in any language

The point I’m trying to drive home is that while these guys make some great observations, they are misplacing the blame. The blame is on the departments and the students, not a language. The professors should be trying to push their students above and beyond what the student believes they are capable of, and the students should be begging the professors to get a better understanding. This leads into another discussion that seems to be coming up a lot that I may talk about at some point which is the 80/20 percentage break for programmers.

Joel on Undergraduate Programming

Ahh, back to where this post really got started. Joel, taking the thoughts of the authors from the article above provided some thoughts on a possible solution. To an extent I agree with Joel. A Computer Science degree should consist of a rigorous set of CS courses in theory, algorithms, systems, languages, etc. How can the slack be picked up? Is creating a new school the place to start?
I disagree with Joel in that I think math really provides a foundation for critical thought. With math things are black and white, right or wrong. There is no middle ground. While software problems can have many solutions, just as math, there are always better and faster ways. We too often think that the first solution is the most accurate. This is usually incorrect. In fact, whenever I or my coworkers are developing something my boss tends to ask, “You’ve reworked it about three times right? It should be pretty good then right?”. Mathematics helped me to learn to think in new/different ways about problems. Going from basic arithmetic to find the slope of a line to calculus and integration showed me that while there are many ways to skin a cat, getting a chainsaw might be overkill. Learning proofs and theorems helped me to realize this. Seeing the ways in which mathematicians approach problems gave me a foundation for my approach to software.

I can’t give math all the credit there. I attended a liberal arts college for the intent purpose of getting a well rounded education. It’s important to be able to understand other things, interact with others, and to be able to examine other methods.

Also, Joel makes mention of starting up a new school with the expressed desire of building a software development factory where you’re education is essentially an internship on roids, thats right 50 Cent…I went there. I actually like the idea. While I do not think that all of the school should be coop/internship, I do believe that you learn more from working with others. Hell, if anything else, you learn that you may be the only thing that saves a project from failure. But more seriously, real projects, with real deadlines provides a foundation for some of what I discussed above. Students aren’t pushed…well, push them. Right on Joel.

Conclusion

Keep in mind that I’m not trying to say that everyone is lazy, careless, and stupid. Nor am I trying to convince anybody that I’m right. I’m only just point out observations that I or friends of mine have made. Also, we’ve obviously seen the opposite where people really amaze you with their level of understanding, ability, and desire to better their craft.

Normally I wouldn’t be so explicit about this whole topic but it seems to be very habitual which is disconcerting. And, it seems that others are seeing this trend too. If the issues can be addressed, awesome. I’m sure there are some more intelligent people than myself mulling this issue around and working on a fix or some fixes. To them I say, “I salute you”.

Pfft…do we really need terrain?

For some reason, I’ve been completely motivated to hack on this 3D Engine. It’s been a great change of pace from the norm: come home, eat, sit at pc, play wow, goto sleep, wake up, repeat (with the occasional tv/movie in between). Last night and today I was able to add a couple of pieces to the engine. As I mentioned before, I got Octree’s working. Well I took some screenies for you all to get a glimpse at the first engine demos.

The red lines represent the Octree boundaries. The awesome thing here is that I was also having an issue with the skymap before I took these screenshots and realized it had to do with the VertexBuffers. Fixed it up and was able to capture these screenshots. I’m working on getting a SS util inside the engine too since that is a generally useful tool to have.
The blob you see in the above SS is made with an open source 3D modeler called Wings3D. It seems to be generally useful so far. Unfortunely, my artistic ability is about that of a 2 year old so you’re stuck with random nothings that I deem blobs.
So, moving on. I couldn’t decide today whether to terrain system or a particle system. I also wanted to get model animation working. In an attempt to get stuff done I broke it down and focused solely on terrains. Here’s what I’ve got so far. Nothing too spectacular, but I’m happy. :)

Enjoy.

12 hours is costly…but sleep, so refreshing.

So, just before I went to sleep Sunday night I had managed to get a number of things working. This was great news. I had content loading to the screen: textures, models, and custom shaders. I had managed to set up a few functional pieces as well: skymap, lighting (through shaders), and a camera system. All of this was done with the XNA 2.0 framework.

However, _just_ before I went to sleep I managed to break something such that the engine would crash at runtime…debugging this seemed to be of no help, and since this was after about 12 hours of coding, I decided the best thing would be sleep.

Last night I returned to battle this phantom crash. Turns out, which I found in a matter of minutes, when you have a class, static, named “Content” that you are using to set the root of the content repository, you shouldn’t name a variable - “Content”. Yes, yes…now is the time to /slap and /punch me. It was at the end of 12 hour coding stint…thats all I got.

Well, to bounce back from my folly and I was able to implement a pretty basic Octree system with correct culling and so forth. I may try to grab some screenshots tonight for you as this is a bit more impressive than “WOOT! I HAVE A SQUARE!”. However, I may just continue to press forward with the engine development and see if implementing an RTree is worthwhile. Thoughts?
That is all you get for now. :)

Back to Dev.

So, I’ve started getting back into development, outside of work. It’s great. I was having issues with my desk that caused me to not want to code with it…then it broke and made things all better! :)
The biggest thing I’ve been doing lately is actually working on my 3D engine. However, rather than rewriting the JoGL code that I once had, I thought I’d give the XNA2.0 framework a try. One word, “wow”. It’s pretty sweet. I’ve been able to push beyond what my older engine could do and now I’m able to load models and even use shaders.

I’m extremely impressed with how they’ve got it setup. I’ll be posting demo screen shots later this week that will include lighting details and other specs.

Clearspring and Widgets…What?

So I heard about this company called Clearspring and heard that they were, in a sense, just some host for widgets. At first this made no sense to me, thus I had to check it out to see what it was all about. Here’s my report.

Clearspring has a pretty cool thing going on. I’m not convinced it’s going to be the end-all, be-all method for widgetry, but what I am convinced about is the start of something interesting. Clearspring has taken the idea behind DRY in the Pragmatic Programmer’s guide to development, and are trying to apply that principle to website developers. All you need is a little bit of time, elbow/knuckle grease, and a server that allows for some processing. Hell, if you don’t even need to take in parameters you could just use straight up Apache.

So this is how it works. Developer Nick decides to create an addition to his blog, The Digital Tumbleweed. Lets just say that he wants to add the Library Thing Widget to his blog. Library Thing has, in awesome delight, provided most of the work for us. We just go and select some parameters right? Well, what if I want to use that same widget to do different things on my site. Also, what about tracking purposes? How do I know who else is using this widget? Can I put this widget into facebook too? I mean, really…library thing is all about social networking right?

Clearspring has taken care of a number of these things for us. All I had to do was write a _tiny_ amount of php and then tell clearspring where to look for the code to include. Library Thing takes in the parameters and then generates all the data I’ve requested.

You can see the LibraryThing Widget Homepage, but the widget itself is in action on my site…just peer to the right and down a few scrolls. :)
Now, I suspect that for some the high level overview is enough to satisfy the craving for info…that or I’ve bored you to tears by now. So feel free to skip this next part…I’m going to get a tiny bit technical. The way this all works is through the use of iframes and flash. No, iframes are not like tiles. Basically whats going on is:

  1. You include a bit of JS on your site. Instead of an include or something similar, you are just throwing a script tag in there. Therefore, less processing on your server side. Leave it to the client side…wise or not? Meh…it works for now. :)
  2. This JS is processed client side which makes a call to the clearspring servers.
  3. The JS is replaced with new code, an iframe/flash, which shows the results of the processed JS.
  4. This new rendering is what you see on your page where you would have normally set your .

The steps and setup I’ve just described are really that simple. The only semi confusing thing here is with the CSS in the widget. If you are including an iframe, your normal stylesheet does not apply to the content in the iframe. Be sure to take care of the CSS inside there.

Is Clearspring the future of web application development? Are reusable, hosted sets of code the next big “advance” in technology? I think only time can tell that, but I will say that they do have a good thing going on. It will be interesting to watch their success.

Haven’t posted in a while…

Well, it’s been a pretty long time since my last post so I felt I should kick off this one with somewhat of a transitionary… I guess what I mean by that is something that semi describes what I’ve been doing in my spare time.

Well, today I finally hopped on the bandwagon…I bought an iPod. I didn’t buy one of the iPod Touch’s. When I got there I compared it to one of my friends iPhone’s and it was really…lacking…the screen was different with contrasts off and so forth…not to mention only 8GB of space. So instead, I decided to go with the 80GB iPod Classic. Similar to the old iPod Mini’s, but with the video built in and some upgraded software. I’m pretty pleased with it so far. We’ll see how I feel in the morning…Can anyone say “buyers remorse”? Nah I think it was money pretty well spent since I’ll use it quite a bit.

Beyond my inquiries into the iPod, I’ve been busy playing WoW. Yes…yes…I know… My response is, “It’s not an addiction…it’s a lifestyle…”

<.<
>.>

Ok well maybe not, but even so. I enjoy the game. Plus there are dev. aspects to it…if you enjoy developing with LUA… I got into LUA a bit back in the day, but have recently stayed away from it. However, I’ve heard reports of Warhammer Online using LUA…so maybe it would be worth my time to venture on in.

I haven’t forgotten about the oo3D project that I’ve got listed in my projects page. However, that may take a back burner for a little bit as a friend and I may delve into the world of XNA on the .Net platform with the intentions of writing a game for the 360. We’re still in the conceptual stages right now. If and when this gets off the ground I’ll post a bit more about it. Until then it shall remain a mystery.

I believe that covers most of the technical things I’ve been doing. I certainly want to get back on the dev train outside of work so I will be hacking things around again real soon. I’ll keep you posted.

Undertaking Projects

So I read a post from a friends blog, “Working Small”, and after I read the quote from Linus Torvalds in it I decided it was time to argue points. :)
Well, the next day at work we talked about the quote because I was curious about perspective on it and it seemed that we both agreed. What we both took the quote to mean was that looking at a project can be a very daunting task. Taking it from start to finish while meeting requirements, fixing bugs, working with new technologies, etc. is quite complicated. However, what we concluded is that the quote really depicts a view on how to go about working on these kinds of projects.

First you must understand that projects for clients are going to need to be thought out, put into a timeline, and then worked on until completion. However, what concerns me is the working on until completion part…thats the portion I do. If you start out by taking some project and work on it’s entire architecture and _then_ begin to develop it, you may have problems.

One of the problems, and possibly the worst, IMO, is the lack of agility. You will have a much more complicated time restructuring a system if you go through the architecture in advance of any of the development. Instead, if you focus on smaller tasks you will have a better idea of the start and end points and be able to develop with a clear vision in mind. Also, you have more ability the change an API or develop new ones as you are developing it due to certain needs. You are less likely to be able to change due to clients needs. Many projects go for some period of time and due to this, requirements may change. The client may decide over that period of time that the functionality of requirement ‘x’ actually needs to do ‘y’. In a hard fast architecture you have 0 agility. Instead, you need to add more to the application which creates bloat and functionality that may not be used. This leads to the inability to refactor your code effectively without leaving broken windows.

Now, these ideas are not new. The guys over at the Pragmatic Programmer have been talking about it for some time, however, I thought that the quote was the common link between what those guys are saying. It really embodies the view most developers should have when undertaking a project. While some architecture is important, it should not be the entire focus of the initial stages of development. There is something to be said about building prototypes and hashing ideas out before really designing the architecture of the final product.

You must have some idea of where you want to go, but that does not mean you should throw agility and prototypes out of the window.