Task Timer là một dự án nhỏ tôi thực hiện nhằm hỗ trợ quản lý các nhiệm vụ cần làm để hoàn thành dự án chính Hogvalord, từ khi project game Hogvalord trở thành công việc toàn thời gian, thì việc có thêm một hobby project như Task Timer này giúp làm mới đầu óc và bản thân khá tốt, tránh đi vào lối mòn. Giữa phát triển game và ứng dụng khá tương đồng, tuy nhiên game là một ứng dụng đòi hỏi nhiều tương tác hơn bình thường, nên khi chuyển qua làm Task-Timer cho tôi cảm giác thư giãn hơn, ngoài ra cũng học thêm được nhiều về WPF và UI Framework của .Net. Mặc dù bây giờ nhiều người chuộng làm Web application, nhưng tôi vẫn thích các ứng dụng desktop. Khi mọi người đổ xô chạy theo Python, AI, ML, Blockchain hay các thứ khác như React Native thì tôi vẫn chuộng C#, .NET. Chưa kể gần đây những phiên bản sau của .NET như Net Core đã hỗ trợ cả Linux, và nền tảng web của .NET cũng đã kế thừa những điểm hay của công nghệ web Java và vượt lên trên về mặt dễ sử dụng, tiện lợi, dễ hiểu, đồng nhất về mặt cấu trúc tổ chức và thiết kế. Ngoài ra cùng với sự phát triển của cộng đồng mã nguồn mở Nuget, các lập trình viên .NET được tiếp sức thêm rất nhiều. Một bước đi rất đúng đắn của Microsoft.
Cá nhân tôi thích Window OS hơn Mac OS vì tính linh hoạt, tiện lợi. Với Mac OS bạn thường phải phụ thuộc vào phần cứng của Apple, cứ sau mỗi lần nâng cấp hệ điều hành Mac lại đòi hỏi một phần cứng cấu hình cao hơn chỉ được cung cấp bởi Apple với cái giá cao hơn mặt bằng chung nhiều. Chưa kể tốc độ “hút máu” người dùng của Apple ngày càng rút ngắn lại, cứ nhìn vào vòng đời của một chiếc iPhone, kể từ khi Steve Jobs qua đời chúng ta sẽ hiểu Apple “khát máu” như thế nào dưới sự điều hành của Tim Cook. Lịch sử phát triển của Apple cũng đã có một thời kỳ lâm vào khủng hoảng nghiêm trọng vì cho ra đời quá nhiều dòng sản phẩm, nếu không có sự trở lại của Steve Jobs và iPhone, cái tên Apple có lẽ đã không còn tồn tại đến thời điểm này. Và giờ đây khi không còn cái bóng huyền thoại Steve Jobs che chở, Apple lại sắp đi vào vết xe đổ ngày xưa. Khác với Apple, Microsoft sở hữu một hệ điều hành rất thân thiện với đại bộ phận người dùng, chúng ta có thể kết hợp Window với Android một cách dễ dàng, hoặc nhiều loại thiết bị khác. Vòng đời của hệ điều hành Window cũng dài hơn rất nhiều và đặc biệt nó ít khi đẩy người dùng vào trạng thái phải chạy đua phần cứng. Đây là những ý kiến của tôi trên quan điểm là một người phát triển phần mềm. Nếu bạn là fan của Apple, bạn sẽ có những lý do riêng cho sự yêu thích của mình. Những ý kiến của tôi chỉ là một góc nhìn khác về các sản phẩm công nghệ, tính kinh tế, và hiệu quả. Tính hiệu quả cũng là lý do chính khi tôi quyết định không dùng những thứ đao to búa lớn như Slack, Harvest, Asana… cho dự án game solo của mình.
Kể từ lúc bắt đầu dự án Hogvalord tôi đã sử dụng add-on Task Timer trên trình duyệt Chrome để theo dõi tiến độ công việc. Đây là một công cụ đơn giản dễ sử dụng đối với nhiều người. Bạn có thể dùng nó để theo dõi thời gian hoàn thành các công việc trong ngày hoặc việc học. Nhược điểm của nó là chạy trên trình duyệt Chrome, tốn khá nhiều bộ nhớ máy tính, trong trường hợp của tôi khi chỉ mở một tab Task Timer trên Chrome đã tiêu hao ~260MB bộ nhớ. Ngoài ra Chrome còn chứa khá nhiều tiến trình chạy ngầm bên dưới để thu thập thông tin của người dùng. Đây là một sự lãng phí không cần thiết cho một ứng dụng phục vụ nhu cầu theo dõi thời gian làm việc offline. Một vấn đề khác là nếu bạn không thích dùng Chrome mà thay bằng Firefox, bạn không thể tìm thấy add-on này, khá bất tiện.
Sau một thời gian suy nghĩ, tôi đã quyết định chế lại công cụ Task Timer này bằng C#, chạy trực tiếp trên hệ điều hành Window. Ưu điểm là chỉ tốn 25MB bộ nhớ. Nghĩa là so với add on chạy trên Chrome thì ứng dụng này sử dụng bộ nhớ hiệu quả gấp 1000%. Ứng dụng Task Timer này không chia sẻ dữ liệu của bạn với bất kỳ công ty công nghệ nào vì nó chạy offline trên máy của bạn, hoạt động không cần kết nối internet và cũng không đòi bạn phải login để lấy địa chỉ email của bạn. Dung lượng nhỏ chỉ chiếm khoảng 1MB ổ cứng. Bạn có thể tải về dùng miễn phí, hoặc có thể tùy tâm hỗ trợ chi phí phát triển cho tôi qua Paypal. (^_^)
Vào tháng 3 năm 2021, tôi có viết công cụ TaskTimer nhỏ để theo dõi tiến độ các công việc cần làm bằng C#, WPF. Mục tiêu của tôi khi làm TaskTimer không phải để cạnh tranh với các nền tảng quản lý tiến độ công việc hay các ứng dụng khổng lồ có sẵn trên thị trường. TaskTimer đơn giản là một công cụ có tính năng tối thiểu phục vụ cho nhu cầu cá nhân tôi và là một dự án bên lề để tôi tìm hiểu thêm về WPF của DotNet. Trải qua một năm sử dụng, công cụ này hoạt động khá tốt. Trong lúc tham khảo các ứng dụng online sẵn có, tôi thấy họ sắp xếp công việc theo kiểu Kaban. Tôi thấy tính năng đó của họ cũng khá thú vị, nên tôi muốn làm thử và đưa một chức năng đơn giản gần giống như vậy vào TaskTimer.
Mục tiêu của lần thử nghiệm này là áp dụng tính năng DragDrop trong WPF.Net Framework. Kinh nghiệm tôi rút ra cho lần thử nghiệm này đó là rất khó để sử dụng DragDrop cho các màn hình có các tương tác phức tạp, nó có thể hoạt động tốt với các control có sẵn trong WPF nhưng lại gây ra nhiều hạn chế cho các UserControl có độ tùy biến cao. Cho nên tôi quyết định quay lại phương pháp cơ bản bắt đầu từ các Event như MouseDown và MouseUp. Một hạn chế nữa của WPF là thứ tự render các UIElement rất khó điều khiển, và quá ít tài liệu nói về điều này. Phương thức BringToFront trong Window.Form đã không còn xuất hiện trong WPF quà là một thiếu sót lớn, gây ra nhiều khó khăn cho lập trình viên UI. Dưới đây là kết quả cuối cùng mà tôi thu được sau gần một ngày mò mẫm.
Có gì mới trong lần cập nhật này?
Uhm, tôi đã thêm vào cửa sổ Kaban View để giúp người dùng có thể quản lý công việc của họ theo phương pháp Kaban. Kaban có nghĩa nguyên gốc trong tiếng Nhật là "bảng minh họa" và cũng là phương pháp quản lý công việc tinh gọn đầu tiên được sử dụng bởi công ty Toyota trong quy trình sản xuất xe hơi. Nhưng bạn cũng có thể sử dụng phương pháp này cho loại dự án nào mà bạn muốn, có thể là đề tài cá nhân hoặc công việc chuyên môn.
Dựa vào khái niệm Kaban, tôi chia tất cả các công việc thành ba nhóm TO DO (việc cần làm), IN PROGRESS (việc đang làm) và DONE (việc đã hoàn thành). Người dùng có thể mở Kaban View lên và sắp xếp các công việc họ cần quản lý bằng thao tác kéo thả đơn giản từ cột này sang cột khác. Cảm nhận của tôi khi sử dụng công cụ do chính mình làm ra đó là nó cho tôi cái nhìn tổng thể tốt hơn về dự án tôi đang thực hiện.
Ngoài ra tôi còn bổ sung thêm bộ lọc ở cửa sổ chính quản lý công việc cho phép người dùng chọn lựa xem các công việc đã phân loại ở trên. Tôi hy vọng những tính năng mới này sẽ giúp ích cho công việc của bạn. Công cụ này được phát hành miễn phí, bạn vẫn có thể ủng hộ tôi nếu muốn. Link tải về ở dưới đây.
Từ ngày quyết định ngồi nhà làm game cho đến nay, tôi đã sử dụng ứng dụng Task Timer này. Tính đến thời điểm hiện tại đã được hai năm. Ban đầu chỉ để theo dõi các công việc trong dự án game. Tuy nhiên, cá nhân tôi không chỉ thích làm một loại công việc, nên đôi khi nhảy qua lại vài việc hoặc thử nghiệm những ý tưởng khác nhau sẽ giúp đầu óc thoải mái và linh hoạt hơn. Ngoài việc làm game, tôi cũng thường hay ngồi vẽ hoặc viết gì đó. Những công việc nhỏ này tuy không thuộc về dự án game nào nhưng cũng chiếm một phần đáng kể trong quỹ thời gian của tôi. Cho nên chúng cũng cần phải được theo dõi. Với đặc thù là những công việc nhỏ lẻ, ngắn thời gian như vậy thì cách quản lý dự án kiểu bình thường trong các ứng dụng hiện giờ có vẻ không phù hợp. Vì chúng thiếu tính linh hoạt.
Tôi nhận thấy cơ chế hashtag hay gắn nhãn (tagging) của các ứng dụng mạng xã hội có vẻ linh hoạt. Chúng lại đặc biệt phù hợp cho việc quản lý các công việc linh tinh không thuộc về một đại dự án nào như tôi vừa kể trên.
Theo quan điểm cá nhân, tôi nghĩ chức năng "tagging" có thể ứng dụng vào nhiều trường hợp. Ví dụ, tôi có thể xem danh sách các công việc được gắn nhãn cụ thể như "vẽ" hay "viết". Thao tác này sẽ nhanh hơn nhiều so với việc phải dò đọc từng dòng trong một danh sách dài hàng trăm dòng. Một trường hợp khác như việc quản lý các công việc theo dự án bằng cách gắn nhãn tên dự án cho công việc đó như "dự án A" hay "dự án B". Hoặc ta cũng có thể biết được công việc nào được thực hiển bởi ai khi gắn nhãn bằng tên người được giao nhiệm vụ như "Adam" hay "Eve".
Căn cứ vào những đặc điểm kể trên, tôi thực hiện tính năng gắn nhãn này cho ứng dụng TaskTimer trong khoảng mười sáu giờ đồng hồ. Mục tiêu của tôi là bám sát phương pháp tinh gọn theo kiểu MVP (Minimum Viable Product). Tôi tập trung nhiều sức lực vào tính năng chính thay vì trang hoàng cho giao diện. Tuy vậy, tôi vẫn đảm bảo tính năng này phải dễ sử dụng (dựa trên cảm nhận của bản thân).
Trong quá trình phát triển tính năng này, tôi sử dụng một bộ dữ liệu giả để kiểm tra độ chính xác và cách tính năng Filter By Tag có hoạt động như mong đợi không. Sau khi mọi thứ có vẻ ổn, tôi dùng thử dữ liệu thật bao gồm danh sách các công việc mà tôi đang có để kiểm tra thì phát hiện một số lỗi, chủ yếu liên quan đến việc dữ liệu cũ và mới không được đồng bộ. Quy trình kiểm tra này cho ta thấy được đa số lỗi của sản phẩm phần mềm hoặc ứng dụng trực tuyến thường xày ra khi chạy với dữ liệu thực tế, cho dù chỉ là một nâng cấp nhỏ cũng có thể ảnh hưởng đến tính đúng đắn của ứng dụng.
Sau những ngày làm việc với ứng dụng Task Timer này để lại cho tôi một số suy nghĩ như sau. Khi thiết kế sản phẩm phần mềm hay ứng dụng trực tuyến cần có một triết lý ban đầu, cũng giống như biết bao nhiêu việc khác trong cuộc sống. Tùy vào triết lý của người thiết kế sẽ cho ra các sản phẩm khác nhau. Ví dụ ngày xưa các chương trình quản lý dự án sẽ bắt đầu từ góc nhìn lớn lấy dự án làm trung tâm, sau đó chia nhỏ ra thành các nhiệm vụ cần làm để hoàn thành. Nếu bắt đầu từ một góc nhìn như vậy người quản lý dự án sẽ có rất nhiều quyền lực và trách nhiệm. Tuy nhiên đa số họ cũng không thực sự làm việc trên bất cứ nhiệm vụ cụ thể nào trong dự án nên mức độ quan liêu trong các dự án này khá cao. Ngoài ra những người trực tiếp thực hiện các nhiệm vụ được giao trong dự án thường không có cảm giác gắn kết với sản phẩm, vì đơn giản họ chỉ làm việc được giao, miễn hoàn thành tốt đúng hạn định là được. Đây là một trong những yếu điểm của mô hình thác nước (water fall). Ngoài ra rất khó để thay đổi giữa chừng trong phần mềm vì tất cả đã được định đoạt ngay từ đầu.
Đối với những cá nhân độc lập ưa tự do, thích thử nghiệm nhiều thứ. Những thử nghiệm đó chính là những nhiệm vụ nhỏ tiêu tốn ít thời gian và dễ hoàn thành. Và có nhiều sự thay đổi diễn ra liên tục trong suy nghĩ của những người thích sáng tạo này. Nếu ta nhìn sự việc từ góc độ này cách tốt nhất để quản lý chúng chính là từ công việc hay nhiệm vụ. Nhiều nhiệm vụ nhỏ hợp lại thành một dự án hoàn chỉnh. Đây cũng là góc độ mà tôi sử dụng để tạo ra tính năng cho Task Timer.
Về kỹ thuật thì tôi chưa học thêm được điều gì đáng kể, ngoại trừ việc thành thạo hơn trong việc nghịch các component của WPF như WrapPanel và tạo ra UserControl riêng để việc gắn nhãn cho từng công việc dễ dàng hơn. Không hiểu các kỹ sư của Microsoft nghĩ gì, nhưng tôi thấy phần viết style cho các UI component khá rườm rà và khó nhớ, khó hiểu khi dùng Markup Language như XAML thay vì dùng Inspector như trong Unity. Ngoài ra một số thuộc tính cơ bản của các UI Element như vị trí (position) muốn truy xuất cũng bất tiện và khó khăn, không trực quan như thời MFC. Hiện giờ họ đã bổ sung thêm MAUI nhưng dự án Task Timer này đã dùng WPF từ trước rồi, nên khả năng thử nghiệm MAUI có vẻ khá xa xôi.
Dù sao tôi cũng đã hoàn thành được tính năng mong muốn cho ứng dụng Task Timer của mình. Phiên bản này chỉ giới hạn cho cá nhân tôi sử dụng. Sau này nếu nó hoạt động ổn thì tôi sẽ cân nhắc đến việc phổ biến cho mọi người dùng. Tạm thời ai muốn dùng thì vẫn còn phiên bản cũ tại đây. Các bạn có thể tải về sử dụng miễn phí.