Online task management service, our view
Once, after a bit of searching for an online task management system, it was decided to write my own “bike”. But with a bias in that area, which, for example, is more important to me - taking into account future and repetitive tasks, and I did not see a competent approach to this issue at any existing service.
A huge number of developers writes similar systems for themselves, even some trends are traced:
- most tend to project management, i.e. bias in the field of collaboration, setting tasks to other users and other types of collaboration
- approaches to certain issues are very similar to market leaders (Google calendar with its principles of setting repetition of tasks, for example). Few people make a normal tree view of tasks, because If this is not particularly common, then it is not particularly in demand. But for some reason, I always fall into that group of users who lack the ability to tweak something, rummage through the settings. A separate song is the ideology of Apple, where in most cases the program settings are reduced to a couple of checkmarks. Sometimes this approach even offends.
In brief, I’ll immediately inform you of the key functions of the system (i.e., those that are either not very common among peers or that they don’t meet at all):
- subtasks, folders, subfolders, unlimited nesting
- repetitive tasks (several repetition methods)
- one-way and two-way synchronization with Google Tasks
- triggers (defined actions to create, modify, delete tasks, the onset of time, etc.)
- custom filters (customizable almost to the SQL query)
We are one and a half developers and many subordinate users - testers. The system is actively used in everyday work, not related to the development of software. The specifics of the work is such that there are many tasks of the same type, many of them have not yet come, but you need to be able to see and do them in advance.
For example, accounting for powers of attorney. The main task is not to miss the deadline and take early action to extend it. For this, the following features were used:
- one month before the end of the power of attorney, a notification was sent by mail (trigger)
- a week before the end of the power of attorney, the task of renewing it was marked as important and, accordingly, was displayed in the list of the most important cases (trigger)
- a separate filter displays all powers of attorney expiring within a month
- a separate filter displays all powers of attorney expiring in the next three months
First of all, a certain disclaimer. We did not try to make the next “combine”, our service is not a system for, for example, bug tracking, because this is a completely different specificity. The service is primarily focused on ordinary “advanced” users who need a little more from task management systems, the scope is accounting for personal tasks (buy, track, remind, etc.) with the possibility of sharing with other users (let them, relatives, Colleagues).
What did not even try to implement:
- time tracking
- bug tracking analogs
- communication, all kinds of social buttons
- strict compliance with the canons of the GTD. More precisely, everything you need seems to be there for this (the “Context” field, tags with unlimited nesting), but they were not particularly focused on the GTD methodology.
And I needed the following from task management (the list, of course, is incomplete, but indicative):
- The task list is fundamentally in a tree view, with folders and subfolders, nesting should be unlimited (no matter what they say that three levels of nesting are enough for everyone - they’re bullshit)
- adding tasks by e-mail, and when sending to different addresses - to different subfolders
- accounting of household affairs (payment by receipts, checking the oil in the car, tracking the deadlines for payment, etc. with varying degrees of frequency, auto-repeat and setting up notifications about all this in completely different ways - I wanted me to warn myself three times about the payment, and about some events - warned about a delay of more than a week)
- for work - there is complexity in quantity - it was necessary to track the expiration dates of powers of attorney, contracts, certificates, etc., and also notifications about missing deadlines had to be configured. The number of these tasks is hundreds, therefore, none of the existing task managers have either dealt with this, or the implementation of all this was inconvenient
- viewing the agenda (the list of current affairs) besides today’s also for any arbitrary period, and with sophisticated filtering, for example, in one list it was necessary to display current tasks, tasks that will begin in the next week, plus all home tasks, except for unimportant tasks (with a small priority)
- give Read-only access to anyone who needs it all
- give write access to anyone you want, and with the right to change only certain fields of the task (for example, an employee who can only change the status of the task)
- use of time zones, as colleagues work with the same data, but in different time zones, so all dates used must be adjusted to the right time zone
- a system of tags (tags) - necessarily tree-like, with the possibility of sharing (i.e. so that certain tags are visible to other users, and others - only to me)
- the possibility of temporarily hiding some tasks (for example, some task is callous, we hide it for 2 days, after which it will appear again). By the way, such a mechanism can be implemented in other ways.
Well, it’s clear that we also need common basic functions:
- output and sending to the agenda mail (it is configured as a simple option - just a list to the mail daily at the appointed time, and in the form of a schedule trigger - the necessary task branches are sent by editing the text of the letter)
- custom user fields (customizability, however, consists only in changing the name, changing the data type is not implemented until I saw the need)
- customizable look of tasks (font, icon, colors)
- arbitrary sorting of subtasks of each task according to three criteria (I repeat, there are many tasks, so there’s no way without sorting)
- RSS feed with customizable notifications (well, I like to look through feedly lying down, at the same time to look at my notification feed)
- Field "Progress" with a graphical display (in fact, few people really need)
- Task priorities
4 months of work, and as a result, a certain “engine” was created for accounting tasks; I realized everything I wanted.
Briefly about what happened.
The basic unit of information is the task. The task has a start date and an end date (due date). If everything is clear with the due date, then the start date should be explained, because not all similar systems have it. In fact, this is the date on which the task is considered relevant. Those. By assigning a date to a task, it will not be displayed in the task list until this date arrives.
At the heart of grouping tasks and sharing access is the concept of a "Task List". Those. a certain set of tasks, for example, “Home”, “Work”, “Computer”, etc. In other systems, this may be called tasklist, project, calendar, workspace, etc. Also, the function of such division is that each list has its own access rights settings for sharing and its own time zone settings.
Separately, about time zones. It seems to me, in practice, few people need it, but we needed it just critically. Several of our employees and those who are granted access work in completely different time zones, editing and viewing tasks from the same lists. If you do not need to specify a specific time specifically when setting the task date, then when setting up notifications and triggers it is sometimes necessary to specify a specific time, for example, change the task status daily at 20-00. Those. the change of status should occur precisely at 20-00 of the time zone of the user who set the trigger. For the correct implementation of this, the time zone of each user and a specific list of tasks is set.
As for access rights, we came to the next decision. The user can delegate the right to view / edit a specific list of tasks to another user.
The following rights can be set:
- View only
- Add tasks only
- Editing tasks only
- Delete tasks only
- Editing and deleting tasks
- Editing and adding tasks
- Adding and Removing Tasks
- Full access
Additionally, subject to the right to edit, a list of fields that the user is not allowed to edit is set. This allows you to implement such a mechanism for user interaction in collaboration - someone who owns the rights sets tasks, and someone else who has only a limited set of rights can only mark tasks as completed. Those. you can set tasks without worrying that someone will erase the task itself or something in it to fix it. It is clear that in project management systems all this is implemented at a higher level, but we did not try to grasp the immensity and implemented the basic set.
Viewing the task tree is possible for any date, both past and future. Because information about tasks is stored regardless of the current date, you can poke some future date and see the status of tasks on that date. For example, often when there is too much time, I want to do something in advance, but if the time has not come yet, then future tasks are not yet shown, because they are in the future. Poke a future date - and see what can be done from future tasks.
Using custom filters, you can realize the following wishes:
- a list of tasks only from a specific folder (for example, with or without subfolders)
- list of tasks for the next week only
- in one list - tasks from a specific list of tasks for the next week, from another list - only overdue for 1 month
Filters are a convenient and flexible thing, but few people screwed it well. For this to be really convenient, you need the ability to group criteria, this is implemented (thanks DevExpress, here they have the lion's share of merit).
In the future, it turned out that there are much more benefits from filters - with their help you can determine the set of agendas sent to the user daily, plus determine the tasks that need to be synchronized with google tasks. But we better write about google tasks separately.
I myself spend 80% of my free time on the iPad, so the question of creating an application for iOS / Android was not - it was necessary. And it was decided not to develop it. Absolutely. We went the other way - through flexible synchronization with Google Tasks, you can transfer the bulk of everyday work (main task editing, viewing and progress marks, i.e. the main functionality of tasks) to Google Tasks, and periodically synchronize all information (two-way or one-way) ) with the service. More precisely, synchronization is automatic, or rather periodic (push Google Tasks does not support). Applications for Google Tasks are more than enough, some are just masterpieces. Why not at least reinvent the wheel in this section, but use other people's work :)
The technical side.
The service is written in ASP.NET and runs on the same Dedic. DB - PostgreSQL, spinning on another.
It was originally written in MSSQL, but then it became clear that postgres is more suitable. It was hard to copy everything to postgres, but it was worth it.
80% of business logic is implemented in the database, so it somehow works faster.
The server components of DevExpress are used - the main load lies on ASPxTreeList. Yes, I had to use server-side components, even if this is unnecessary traffic for the client, but otherwise I won’t be able to work with thousands of tasks and some functions. Yes, this leads to a certain inertia of the “tree” operation, but the “response” of about 200-300 ms is almost imperceptible, therefore it arranged. Of the similar components, I tried Telerikovsky, but there are very unpleasant brakes when folding / unfolding a tree, it is uncomfortable to work.
ASP.NET WebForms is used, I know that the technology is a bit outdated, but almost all the work is concentrated on one page and constant callbacks of one element, so switching to MVC would not do much. And ViewState seems to have minimized the eternal problem of excessive size.
In two separate applications, operations with mail (receiving tasks by mail and sending) and synchronization with Google Tasks are made. They were written in Delphi.
- For the sake of speeding up development, many relatively infrequently used parts of the interface (editing task lists, triggers) are written using ready-made controls from DevExpress, so it's a little heavy
- All common browsers are supported, but there may be problems with older versions. IE8 sometimes throws errors, but because there’s no clean IE8 at hand, hands haven’t reached the bug fix yet.
- Synchronization with Google Tasks works, but the malicious Google has not yet sufficiently increased the quota for requests to their APIs, so theoretically, in the case of an influx of users who configure this feature, synchronization may stop at night at first. Fuck their support as I can.
Monetization and data security
Monetization in the foreseeable future, of course, is not planned. If it does, then only if there is a constant growth of active users and an increase in demand for capacities. At the moment, we have enough resources to allocate a couple of servers for this project without tension, especially at hetzner prices. In which case - you can increase the quantity. If any paid accounts are entered, then it’s good practice that previously registered users will receive a lifetime free “premium” account. About data safety - in case of closing the service, all users will be notified and there will be at least two months for data transfer. If someone knows how best to offer users to back up data - please let us know. So far, nothing comes to my mind except for synchronization in Google Tasks.
- Integration with google calendar. In the process. While there is no clear understanding in what form it is beautiful to implement, because There are no analogues.
- Optimization, optimization, optimization. Especially the use of client traffic. Plus for old browsers.
- Add temporary options for repetition and task planning (while basic periodicities are implemented)
- I rushed to write a calendar representation of the tasks, wrote, but then decided to focus on the standard tree-like, because it’s not worth it to grab onto everything at once, without making already realized what is already glitchless.
Well, a little later I will publish a post in more detail about triggers and synchronization with Google Tasks, there is something to tell.
The link to the service itself is betasked.ru
UPD I think a lot of people were scared of the first screen, but nothing prevents you from removing unnecessary fields, choosing a theme and working like this:
or like this: