|
I am an atypically avid reader who focuses largely on non-fiction. As I read, there are always some facts I want to note for later reference. I have tried highlighting, notebooks, filing folders - they all had the same draw-back: they were not searchable. Looking now for software, I found few good options; the best of the bunch was Google Notebook, whch worked okay ... until it was discontinued. So I've kicked off a project of of my own - an open source filing cabinet application. While the official name has yet to be determined the project is codenamed "Agnosco", a Latin verb meaning "to perceive". Below is a wireframe sketch of the basic concept of the application: Caption: The basic concept of the File Cabinet application. Click for a larger version. Features / User Stories Introduction As I am creating this project with largely my own needs in mind, I have decided to break from convention and write these user stories in the first person. As I am both the provider and client for the first release, I will also break with best practice for the first few use cases by providing some technical solutioning within the user stories, which ordinarily is not a good idea. More than user stories, these are epics that will be translated into best practice "role-goal-reason" format in the near future so I can appropriately plan sprints. Keep in mind as well that these are also very preliminary; while the core concept will stay the same, I will likely change these in the future to suit my needs and I will most certainly be adding new user stories as I think of new features. Accessing Agnosco Wanting to use the Agnosco system, I point my web browser to the URL of the application. I am immediately presented with a simple, unobstrusive login screen requiring a username and password. It provides me the ability to remember my username and password on this machine. The authentication is asynchronous, providing feedback upon login failure. Upon success, the login window fades away to the application, which loads any user-specific content, such as notebooks. At left, I see a list of the notebooks to which I have access. All of my notebooks belong to my cabinet. I only get one cabinet, but can be granted access to one or more notebooks in a friend's cabinet (details in another story). Clicking on any notebook will open a tab at right with a datatable (details below) showing me all the notes in that notebook. At right, the home screen shows me the last few (perhaps 10 or 20) notes that have been altered recenty, ordered by date. They are in a datatable that I can sort by any of the columns provided. The columns are, at minimum: title, last modified date, author, and size in bytes. The columns I see as well as their order should be configurable (details in another story). At top are basic controls allowing for the creation of new notes, the searching of existing notes, and setting my preferences. At bottom is an status / message area that provides feedback during the process, such as errors and warnings as well as loading messages. Creating a Note By clicking the create new note button, a rich text editor tab opens; this allows me to create a new note and assign it properties like title, tags, and container notebook. The note should auto-save as a type (without disrupting my work) at an interval that makes most technical sense. When a note is saved, the application should auto-add tags based on the content within the Note. Perhaps this should not occur during auto-save for efficiency's sake? I should also be able to add a reference to a third-party source (like a book) so that I can track the source of the note in the form of a URL, a book reference, or a free-form text field. I should be able to "attach" a document like a text or spreadsheet document to the note for easy reference. Looking Up a Note by Searching I should be able to search for a note just like a normal search engine; the search should be keyword- and title-driven. The results should be displayed in a data table in a tab as described in other stories. Looking Up a Note by Other Means While browsing in a notebook, I should be able to apply filters and sorts for any and all columns available in the data table or just in the database. Setting My Preferences I should have the ability to set preferences, such as who can access the notebooks within my cabinet. More detail will be added here as other features are developed. Deleting Notes When I deleted a note, it should be flagged as "garbage" and excluded from all views except for a trash bin of some kind. I should be able to empty the trash whenever I want, but deleted notes should automatically urge from the system after a set period of time, such as after 14 days. Technologies Client Tier / Presentation Layer Based on the defined features, one of the definitive, non-negotiable requirements for the project is that it must be powered from the last Web 2.0 technologies to create an easy-to-use and aesthetically-pleasing interface. Some utilities and widgets we're going to need are: data tables, buttons, a tab browser, an event handler, a rich text editor, and asynchronous communication with the server. With a focus on rapid and agile development, we need a Javascript library that sports pre-existing components and a (relatively) friendly, preferably object-oriented library. With these criteria, there are really only two options: the Yahoo! User Interface library and ExtJS. Having used them both, I would absolutely opine they are both fantastic; they both had very active and supportive communities and solid API documentation (for the record, YUI is unmatched in its provided examples, which number greater than 300). ExtJS components come, out of the box, with a very "desktop" look and feel with a great theme. YUI widgets have a more web-based look and feel, but embed unobtrusively into normal web pages. ExtJS has a nice 'xtype' feature for creating complex components by embedding standard Javascript objects, while YUI maintains a very object-oriented structure. For this application, as a matter of pure developer preference I am choosing to go with YUI. I want this application to look like a web application and by using YUI's default Sam skin I will reduce the CSS I will have to manage myself. Server Layer / Business Tier Based on the requirements of the client tier / presentation layer, we know the server side must have a database, an object access method (i.e. must return XML or JSON on request), and must support an highly agile development methodology. As a project manager and technologist, my own requirements to this would be that the development language/library must support object-relational mapping (ORM), must have friendly URLs (e.g. through Apache's mod_rewrite), and must follow standard development patterns (specifically the front controller and MVC patterns). So let's get into specifics: On the database side, we will need store the note and authentication/authorization information. As this is an open source project, we will stick to the de facto standard: MySQL. The server side will also have to be able to receive and process requests for the Web 2.0 client and return a result in a Javascript-digestible format (e.g. XML or JSON). In terms of business tier, there are four option categories: PHP, Ruby on Rails, ASP.NET, and Java. As this is an open source project, ASP.NET is probably not the best option, if for no other reason than its incompatible licensing options. Personally, I don't have a lot of experience with Ruby on Rails, so I eliminated that as an option as I want to avoid delays in this project. Between Java and PHP is honestly a difficult choice. Each has advantages and disadvantages. The advantage with Java is that a J2EE architecture is built for multi-tiered web applications; in addition, Java has pre-defined presentation libraries like JSF. The advantage with PHP is that it is a smaller initial overhead and allows for a quicker start time. For this project, as a principal objective is to get the project running quickly, I decided to use PHP. As we will be using PHP, the web server is obvious: Apache. I recently wrote a blog on the merits of using PHP frameworks. As such, this project will also avail itself of either Zend Framework, Symfony, or Cake. While I have used both Zend Framework and Symfony professionally and have equal respect for each, as I am currently in the process of evaluating Zend Framework, I will go with that PHP framework. Moving Forward Sometime during the first week of June, I will have a prototype (Agnosco version 0.1) available online that sports some basic functionality: adding a new note, opening a notebook, adding a new notebook, and (possibly) searching for notes. Around the time of this first release, I will publish the backlog and project schedule to keep everyone apprised as to where the project currenty sits. Sometime toward the end of June or during the first half of July, version 0.5 will be available online, which will add authentication and authorization and (hopefully) filtering functionality. The aforementioned project schedule will determine precisely what is in this release. After this first major release, I will be opening the project up for community involvement, including UI/styling, artwork, development, and testing. That's all for this blog. Keep your eyes open for the official project page to go up soon. |