
独立产品的任务表很容易写满:修一个导出错误,加一套主题,再试一个 AI 功能。每件事看起来都不大,放在一起却超过一周。问题通常不是没有排期工具,而是把未知耗时也当成了确定容量。
先写容量,再挑任务
这里用“半天块”做一个粗单位,不把它说成精确工时。一周有 8 块可用时间,先留 3 块缓冲,维护占 2 块,真正给新功能的只剩 3 块。缓冲并非等待浪费,而是为复现失败、用户反馈和生活中断留位置。任务超过容量就进等待队列,不自动挤掉休息。
Anthropic 在 10 月 13 日发表、15 日更新的 源码管理研究讨论了 AI 代码产出与审查设施的压力。对一个人做的小产品,我没有理由照搬大型内部系统;更直接的启发是,代码写得快,不代表复核和交付也同样快。排期应给检查留格子。
限制进行中数量
下面的选择器按优先级稳定排序,只在剩余容量里接纳完整任务。它不把一个 3 块任务悄悄拆成 1 块,也不宣称求出了最优收益。一个任务做不下,先留在队列中;若要拆分,需要人重新定义一个仍可交付的小结果。
“进行中最多一项”适合某些个人工作流,并不是所有人的效率定律。紧急维护可能需要打断,协作任务也有等待时间。要记录的是打断发生了什么,而不是拿一个自动算出的低分评价自己。任务系统是帮助选择的,不是考勤装置。
运行 node week.js 会输出被选任务与等待项,验证容量不超额、缓冲不被占用、负耗时被拒绝。本地没有测个人生产率,也没有连日历。下一周还没有发生,示例只是一个可调整的计划,不是一段已完成的生活记录。
可独立运行的核心例子
function plan(tasks,total,reserve) {
if(!Number.isInteger(total)||!Number.isInteger(reserve)||reserve<0||reserve>total)throw Error('容量无效');
const ids=new Set();
const queue=tasks.map((t,index)=>{
if(!t.id||ids.has(t.id)||!Number.isInteger(t.blocks)||t.blocks<1||!Number.isFinite(t.priority))throw Error('任务无效');
ids.add(t.id);return {…t,index};
}).sort((a,b)=>b.priority-a.priority||a.index-b.index);
let left=total-reserve;const selected=[],waiting=[];
for(const t of queue) {
if(t.blocks<=left){selected.push(t);left-=t.blocks;}else waiting.push(t);
}
return {selected,waiting,reserve,unallocated:left};
}
const result=plan([
{id:'maintenance',blocks:2,priority:10},
{id:'svg-export',blocks:3,priority:8},
{id:'ai-theme',blocks:2,priority:6}
],8,3);
if(result.selected.reduce((s,t)=>s+t.blocks,0)!==5||result.waiting.length!==1||result.reserve!==3)throw Error('容量错误');
let rejected=false;try{plan([{id:'bad',blocks:-1,priority:1}],8,3);}catch{rejected=true;}
if(!rejected)throw Error('负估算应拒绝');
console.log(JSON.stringify(result,null,2));

网硕互联帮助中心





评论前必须登录!
注册