Free Professional Web Development    Posted:


I'm pleased to announce my immediate availability for some freelance Web development projects. Lately, I've been quite swamped with a very awesome project at my day job. Many things had to be put on hold as a result of that project. However, it looks like the worst is now behind me, and I find myself with much more free time than before!

As such, I'm opening the doors to any and all (except full-time, because I love my day job) Web development opportunities. I guarantee absolute satisfaction and reliable, efficient Web sites, and I deliver quickly. All you need to do is provide the requirements for your project in the comments section of this article. I'll pump out at the very least a proof of concept that becomes your property (free of charge), no questions asked.

You will not be disappointed. Use this as an opportunity 1) to get free stuff and 2) to test your requirements-gathering/communicating skills. Let the battle begin!

Comments

Review: Django 1.0 Web Site Development    Posted:


Introduction

Several months ago, a UK-based book publisher, Packt Publishing contacted me to ask if I would be willing to review one of their books about Django. I gladly jumped at the opportunity, and I received a copy of the book a couple of weeks later in the mail. This happened at the beginning of September 2009. It just so happened that I was in the process of being hired on by ScienceLogic right when all of this took place. The subsequent weeks were filled to the brim with visitors, packing, moving, finding an apartment, and commuting to my new job. It was pretty stressful.

Things are finally settling down, so I've taken the time to actually review the book I was asked to review. I should mention right off the bat that this is indeed a solicited review, but I am in no way influenced to write a good or bad review. Packt Publishing simply wants me to offer an honest review of the book, and that is what I indend to do. While reviewing the book, I decided to follow along and write the code the book introduced. I made sure that I was using the official Django 1.0 release instead of using trunk like I tend to do for my own projects.

The title of the book is Django 1.0 Web Site Development, written by Ayman Hourieh, and it's only 250 pages long. Ayman described the audience of the book as such:

This book is for web developers who want to learn how to build a complete site with Web 2.0 features, using the power of a proven and popular development system--Django--but do not necessarily want to learn how a complete framework functions in order to do this. Basic knowledge of Python development is required for this book, but no knowledge of Django is expected.

Ayman introduced Django piece by piece using the end goal of a social bookmarking site, a la del.icio.us and reddit. In the first chapter of the book, Ayman discussed the history of Django and why Python and Django are a good platform upon which to build Web applications. The second chapter offers a brief guide to installing Python and Django, and getting your first project setup. Not much to comment on here.

Digging In

Chapter three is where the reader was introduced to the basic structure of a Django project, and the initial data models were described. Chapter four discussed user registration and management. We made it possible for users to create accounts, log into them, and log out again. As part of those additions, the django.forms framework was introduced.

In chapter five, we made it possible for bookmarks to be tagged. Along with that, we built a tag cloud, restricted access to certain pages, and added a little protection against malicious data input. Next up was the section where things actually started getting interesting for me: enhancing the interface with fancy effects and AJAX. The fancy effects include live searching for bookmarks, being able to edit a bookmark in place (without loading a new page), and auto-completing tags when you submit a bookmark.

This chapter really reminded me just how simple it is to add new, useful features to existing code using Django and Python. I was thoroughly impressed at how easy it was to add the AJAX functionality mentioned above. Auto-completing the tags as you type, while jQuery and friends did most of the work, was very easy to implement. It made me happy.

Chapter seven introduced some code that allowed users to share their bookmarks with others. Along with this, the ability to vote on shared bookmarks was added. Another feature that was added in this chapter was the ability for users to comment on various bookmarks.

The ridiculously amazing Django Administration utility was first introduced in chapter eight. It kinda surprised me that it took 150 pages before this feature was brought to the user's attention. In my opinion, this is one of the most useful selling points when one is considering a Web framework for a project. When I first encountered Django, the admin interface was one of maybe three deciding factors in our company's decision to become a full-on Django shop.

Bring on the Web 2.0

Anyway, in chapter nine, we added a handful of useful "Web 2.0" features. RSS feeds were introduced. We learned about pagination to enhance usability and performance. We also improved the search engine in our project. At this stage, the magical Q objects were mentioned. The power behind the Q objects was discussed very well, in my opinion.

In chapter 10, we were taught how we can create relationships between members on the site. We made it possible for users to become "friends" so they can see the latest bookmarks posted by their friends. We also added an option for users to be able to invite some of their other friends to join the site via email, complete with activation links. Finally, we improved the user interface by providing a little bit of feedback to the user at various points using the messages framework that is part of the django.contrib.auth package in Django 1.0.

More advanced topics, such as internationalization and caching, were discussed in chapter 11. Django's special unit testing features were also introduced in chapter 11. This section actually kinda frustrated me. Caching was discussed immediately before unit testing. In the caching section, we learned how to enable site-wide caching. This actually broke the unit tests. They failed because the caching system was "read only" while running the tests. Anyway, it's probably more or less a moot point.

Chapter 11 also briefly introduced things to pay attention to when you deploy your Django projects into a production environment. This portion was mildly disappointing, but I don't know what else would have made it better. There are so many functional ways to deploy Django projects that you could write books just to describe the minutia involved in deployment.

The twelfth and final chapter discussed some of the other things that Django has to offer, such as enhanced functionality in templates using custom template tags and filters and model managers. Generic views were mentioned, and some of the other useful things in django.contrib were brought up. Ayman also offered a few ideas of additional functionality that the reader can implement on their own, using the things they learned throughout the book.

Afterthoughts

Overall, I felt that this book did a great job of introducing the power that lies in using Django as your framework of choice. I thought Ayman managed to break things up into logical sections, and that the iterations used to enhance existing functionality (from earlier chapters) were superbly executed. I think that this book, while it does assume some prior Python knowledge, would be a fine choice for those who are curious to dig into Django quickly and easily.

Some of the beefs I have with this book deal mostly with the editing. There were a lot of strange things that I found while reading through the book. However, the biggest sticking point for me has to do with "pluggable" applications. Earlier I mentioned that the built-in Django admin was one of only a few deciding factors in my company's choice to become a Django shop. Django was designed to allow its applications to be very "pluggable."

You may be asking, "What do I mean by 'pluggable'?" Well, say you decide to build a website that includes a blog, so you build a Django project and create an application specific to blogging. Then, at some later time, you need to build another site that also has blog functionality. Do you want to rewrite all of the blogging code for the second site? Or do you want to use the same code that you used in the first site (without copying it)? If you're anything like me and thousands of other developers out there, you would probably rather leverage the work you had already done. Django allows you to do this if you build your Django applications properly.

This book, however, makes no such effort to teach the reader how to turn all of their hard work on the social bookmarking features into something they could reuse over and over with minimal effort in the future. Application-specific templates are placed directly into the global templates directory. Application-specific URLconfs are placed in the root urls.py file. I would have liked to see at least some effort to make the bookmarking application have the potential to be reused.

Finally, the most obvious gripe is that the book is outdated. That's understandable, though! Anything in print media will likely be outdated the second it is printed if the book has anything to do with computers. However, with the understanding that this book was written specifically for Django 1.0 and not Django 1.1 or 1.2 alpha, it does an excellent job at hitting the mark.

Comments

Andy Rutledge: Don't Walk; Run    Posted:


This morning I've been doing some research for work, and I stumbled upon an article that is very helpful for freelancers like me (relatively new to the freelance arena) and people looking for freelancers/design agencies.

Given the recent freelance opportunities that I have been involved with, I found this article to be particularly beneficial. There are many pieces of advice that, taken into consideration, really do distinguish the good freelancers/design agencies from the bad ones.

If the agency has any clue at all, your company will basically have to "interview for the job" in order to be accepted as a client. Agencies that know what they're doing work hard to take on only those projects and those clients that are a good fit for their skill set, even their personality. They'll want to get to know you a bit and they'll want to learn much about your project, its scope, and your specific expectations before they agree to work with you. If you find that they immediately suggest you work with them and start talking about sending you a contract, you're probably talking to the wrong agency. Hang up the phone.

I know that I am guilty of such behavior. In the past, I have quickly jumped at any opportunity to make some extra cash as a freelancer. It usually doesn't take a long time before I begin regretting my hasty acceptance of a job. This is extremely sound advice.

If anyone other than the designer who did the work presents the designs to you, something's amiss and there is likely more yet to go astray. It is an unfortunate habit among some agencies to ever get between the client and the designer. This is a terrible mistake and a clear sign that the agency, large or small, is not well run. As a result, the work produced by the agency is likely to be flawed for the voids in understanding and effectiveness that result. In short, if your project's design phase does not begin and end with direct contact between yourself and the designer, you're getting short shrift. Find another agency.

I'd like to twist this one around a little. I completely agree with what Andy has said here, but I have also been on the receiving end of this particular type of situation. On one recent project, I was receiving instructions from a person who apparently didn't have the same goals as the "real" client. The end result was a product the "real" client didn't really want. Working directly with the client/agency is critical to a successful project.

There are several other important points in Andy's article, and I wholeheartedly recommend that you read it if you find yourself in such a situation. It will only help. In conclusion, I just want to share another quote from Andy's article:

And if you do notice too many of these telltale signs of incompetence in your current agency — don't walk; run.

Comments

Freelance Work and Unprepared Clients    Posted:


I've been working on a freelance job for the past couple months. I can't get very specific about what I've been doing because of non-disclosure agreements and such, but suffice it to say that it's an interesting project. For someone else, that is. The main reasons I took the job are because I expected to have a little free time between semesters and it was supposed to pay well.

The first strange thing I noticed was that it took a considerable amount of time to get any sort of information about the project after signing the appropriate documents. Never once had it taken that long to get any useful information on a freelance project.

The second strange thing about the job was that the terms of the deal changed by way of compensation. This was excusable because of my relative lack of experience with certain required technologies.

Anyway, after I got the initial requirements and specifications document for the project from the client, I was surprised at how incomplete and unclear it was. I am used to very explicit documents for requirements--at least several times more explicit than this particular document.

Now, everything up to this point was quite strange, but I kept going with the project anyway. Naturally, this project required that I use some 3rd party tools and utilities in order to arrive at the end product. The first week after having received the specifications was spent almost in its entirety trying to get one of these to work properly. Thankfully, this particular utility was open source, so I could freely make modifications to fix it. After a week of off and on debugging, I found the one line of code that I needed to change in order to make the entire utility functional.

The next week was spent working on the basic structure of the project setup. I did what I could with the meager requirements and specifications that were provided me, requesting clarification repeatedly from the client.

It wasn't long after this that there were some hardware failures on the client's end. This effectively stopped all development for nearly a week. After that problem was resolved, I was able to resume development again. I wasted some valuable time just trying to remember where I had left off. Anyway, development resumed.

As I encountered more uncertainties with the requirements and specifications, I attempted to ask my client which direction I should go for various situations. In many cases, I was met with disdain and disrespect. I usually have a good amount of patience in any situation, but all of this put together really frustrated me. It got to the point where I just wanted to pass everything I had done on to someone else. But I kept going.

Time went on, as did development. Things came along pretty well in the last few weeks. However, the client felt the need to change the project requirements on me time after time after time. And still, I went forward. On several occasions, when asking for more information about these new requirements, I was basically told, "Use your best discretion."

WHAT THE HECK IS THAT?! I mean, I'm a freelance developer working on a project for someone out there. They are supposed to know all of the details (as far as features and functionality are concerned) about their own project, and they're telling me, "Use your best discretion!" Come on folks! You are in charge of coming up with things like that.

To go along with that, today I was asked to implement a feature that was in the first revision of the requirements but removed from the second revision. When I asked for more details about the feature (the original specifications only had two short sentences pertaining to this feature), again, I was met with something like, "Use your best discretion." This time, though, I went on to request more information, explaining that it wasn't my place to determine this information.

I asked my client a series of maybe 20 questions pertaining to the requirements of this feature. It seemed as though my client had never actually considered the questions and situations I was wondering about. I told them to thoroughly consider their feature request, write something formal and detailed up, and send it to me when it was done. At that point, I told him, I would review the information they provided. Then I would respond with any questions or comments.

For anyone out there who has recently considered hiring a freelance developer: do yourself and the developer a favor. Think things out thoroughly and have details prepared for when the developer begins working. Detailed requirements help guarantee that the project will be as close to correct the first time, thus making projected timelines more reasonable.

In summary, if you're looking for a freelance developer:

  1. Have things ready on time: taking a long time to give your developers material makes time for the developer's situation to change. Maybe they won't have the time they were planning in order to complete the project if you take too much time to get requirements and specifications.
  2. Know exactly what you want beforehand: developers work better with concrete requirements. If you're not sure about something in particular, you'd better be sure it's not high priority and that it can maybe be done in a second version of the project.
  3. Don't change requirements after development has begun: If you do your part, you should not need to change requirements in the middle of the development process. Changing requirements only causes the development timeline to shift and makes the developers frustrated. Developers, as a whole, are quite testy and do not like having to redesign their entire code base.

I'm sure there are other bits and pieces of useful information I could add, but this about completes my rant for tonight. I hope you enjoyed it.

Comments