- Knowledge
- technology
- OOP
- Tips
- Programming
- Tips
- Tutorial
- SEO
- Ranking
- Knowledge
- Special Day
- Seo
- Bug
- Data science
- Seo
- artificial intelligence
- Machine Learning
- Robotics
- happyNewYear2021
- newYearEve
- 2021
- Automation
- Smart Home
- Career
- Best Practices
- Git
- Logging
- Web Fundamentals
- DNS
- HTTPS
- Performance
- AI Tools
- ChatGPT
- Claude
- Gemini
- Laravel
- Eloquent
- MySQL
- HTTPS
- TLS
- Web Security
- Certificates
- Developer Life
- Debugging
- Docker
- DevOps
- Transactions
- Queues
- LLMs
- AI
- AI Coding
- Developer Tools
- React Native
- Expo
- Kate PMS
- Mobile Apps
- Laravel
- Authentication
- Sanctum
- Cookies
- API Design
- Payments
- Idempotency
- DeepSeek
- Open Source AI
- LLMs
- AI News
- Git
- Version Control
- AI Coding
- Prompting
- PHP
- Checklist
- MCP
- AI Agents
- OpenAI
- Architecture
- Microservices
- Modular Monolith
- Estimation
- Developer Life
- Project Planning
- Humour
- OAuth
- OpenID Connect
- Authentication
- Embeddings
- Vector Search
- RAG
- pgvector
- OpenAI
- GPT-4.1
- Codex CLI
- Events
- Testing
- Clean Code
- Maintainability
- Code Review
- Webhooks
- API
- Security
- Claude Code
- Workflow
- AI
- LLM
- Prompt Injection
- Mobile
- React
- Networking
- TCP
- UDP
- HTTP/3
- CLAUDE.md
- AWS
- Cloud Security
- Backups
- PHPUnit
- Software Engineering
- Leadership
- Communication
- RAG
- Embeddings
- AI Engineering
- IT Infrastructure
- Networking
- Access Control
- CI/CD
- GitHub Actions
- Gemini CLI
- Claude Code
- JavaScript
- Async/Await
- Node.js
- Promises
- Security
- Cryptography
- Passwords
- MySQL
- Database
- Vibe Coding
- Software Quality
- DNS
- Code Reading
- Onboarding
- Productivity
- Background Jobs
- Developer Humour
- Estimates
- Dev Life
- JWT
- o3-mini
- DeepSeek R1
- Rate Limiting
- Kate PMS
- E-Signing
- Audit Trail
- REST
- GraphQL
- API Design
- Laravel 12
- Upgrade Guide
- Open Source
- Self-Hosting
- Task Scheduling
- Cron
- Secrets
- CORS
- PHP
- PHP-FPM
- OPcache
- GitHub Copilot
- Software Architecture
- Engineering
- TypeScript
- JavaScript
- Type Safety
- AI Security
- React Native
- Product Design
- AI Agents
- Kiro
- Queues
- Redis
- RabbitMQ
- AWS SQS
- Nginx
- Apache
- GPT-5
- gpt-oss
- Clean Code
- Architecture
- Naming
- Documentation
- Career
- ADR
- Teamwork
- Supply Chain
- Kate HRM
- HR Software
- Permissions
- System Design
- Pagination
- SSH
- Linux
- Big O
- Databases
- Laravel Boost
- MCP
- Developer Skills
- Validation
- Databases
- Indexes
- Code Quality
- Deployment
- Developer Humour
- Feature Flags
- Code Review
- Pull Requests
- Docker
- Cursor
- Authorization
- RBAC
- Gemini
- Long Context
- PHP 8.4
- Caching
- Dependency Injection
- Web Performance
- Browser
- CSS
- Database
- Migrations
- ChatGPT
- AI for Developers
- Monitoring
- On-Call
- REST
- Backend
- SQL
- NoSQL
- Database Design
- Coding Agents
- Claude 4
- API Resources
- REST API
- Load Balancing
- Scaling
- AWS
- AI Tools
- Claude
- Sora 2
- CTE
- 2FA
- TOTP
- Programming Languages
- Prompts
- Developer Workflow
- API Gateway
- APIs
- Passport
- API Auth
- Learning
- Burnout
- Developer Growth
- Web Development
- SEO
- Kate Mall
- ChatGPT Atlas
- Agent Skills
- Middleware
- Laravel 12
- Collections
- Context Window
- Monitoring
- Commit Messages
- Self Review
- Growth
- Regex
- Programming Basics
- Text Processing
- Database Design
- Normalization
- Linux
- Server Security
- Linux Foundation
- Open Standards
- Legacy Code
- Documentation
- AI Workflow
- File Uploads
- Test Data
- Hashing
- Performance
- Caching
- Enums
- Scope Creep
- Estimation
- Codex
- Gemini CLI
- Timezones
- Carbon
- Bugs
- PHP 8.5
- Gemini 3
- GPT-5.1
- Data Integrity
- Event Loop
- Async
- Opus 4.5
- AI Models
- React
- Forms
- Frontend
- Backups
- AI Images
- DALL-E
- Midjourney
- Race Conditions
- Concurrency
- Legacy Code
- Refactoring
- Senior Engineer
- Scope
- LLM
- CDN
- Web
- Sub-Agents
- Soft Deletes
- Audit Log
- Concurrency
- AI Learning
- NestJS
- AI Evals
- Policies
- SPF DKIM DMARC
- Unicode
- UTF-8
- Knowledge Graph
- Value Objects
- Technical Debt
- Feature Flags
- Laravel Pennant
- Deployment
- Copilot
- Composer
- Dependencies
- Artisan
- Automation
- AWS S3
- Object Storage
- Cloud
- Small Language Models
- Ollama
- Production
- Sessions
- HTTP
- Mentoring
- SQL
- Virtual Machines
- Web Development
- HTTP/2
- QUIC
- Web Performance
- AI Integration
- LLM API
- SOLID
- OOP
- Hosting
- Serverless
- Merge Conflicts
- Temperature
- AI Development
- Reverse Proxy
- Nginx
- Infrastructure
- Verification
- Passkeys
- WebAuthn
- Teams
- Communication
- Stakeholders
- Monorepo
- CI/CD
- Versioning
- JSON Schema
- Livewire
- Inertia
- Meetings
- Distributed Systems
- Privacy
- Full-Stack
- T-Shaped Skills
- Money
- Notifications
- Web Security
- HTTP Headers
- CSP
- Function Calling
- Load Testing
- k6
- Data Extraction
- Debugging
- WebSockets
- SSE
- Real-Time
- Laravel Reverb
- Infrastructure as Code
- Terraform
- Side Projects
- Laravel Pint
- OpenAPI
- Swagger
- UX
- Multimodal
- Jest
- Pair Programming
- APIs
- Rate Limiting
- Resilience
- Dev Humour
- Design Tokens
- JWT
- API Keys
- Sessions
- PHPStan
- Rector
- Incidents
- Reporting
- Dashboards
- Zero Trust
- IAM
- Search
- Laravel Scout
- Junior Developers
- Mentoring
- Images
- WebP
- AVIF
- Bug Reports
- Let's Encrypt
- Design Docs
- Software Design
- Observers
- Replication
- Accountability
- Data Structures
- Reliability
- LLM Memory
- Error Handling
- Payments
- Payment Gateway
- Webhooks
- PCI DSS
- Observability
- OpenTelemetry
- Personal Brand
- Writing
- Conventions
- Dates
- Scheduling
- Disaster Recovery
- Compression
- Brotli
- Deadlines
- Developer Habits
- State Machines
- Tech Roles
- UUID
- ULID
- Horizon
- Planning
- Engineering Culture
- Ownership
- Soft Skills
- Socialite
- Cost Control
- Collations
- Unicode
- Octane
- PostgreSQL
Estimating Software Tasks: A Comedy in Three Acts
About Post
Every developer has performed this play. Most of us have performed it this month. It has three acts, a cast of one optimist, and an ending everybody in the audience saw coming except the lead actor.
Take your seats. Phones on silent. The curtain rises.
Act I: The Question
Monday morning. A stand-up meeting. Coffee is still hot. Hope is still alive.
Product manager: Small one. Can we add an "export to CSV" button on the payments page?
Developer (already picturing the code): Oh, that's easy. The query exists, I just loop and write rows. Two hours.
Somewhere backstage, a stagehand quietly cancels the developer's Wednesday.
Notice what happened. The developer didn't estimate the task. They estimated the happy path of the part they could already see: the loop. Nobody estimated the button, the permissions, the edge cases, the review or the deploy. Those weren't in the picture yet.
Act II: The Discovery
Monday afternoon, then Tuesday, then a bit of Wednesday.
The loop works in twenty minutes. The developer feels like a genius. Then the plot arrives:
- ❌ Some payments have a tenant name with a comma in it. The CSV now has an extra column for one row and Excel is furious.
- ❌ Arabic names come out as question marks in Excel until you add a byte order mark. Nobody has ever remembered the BOM on the first try.
- ❌ The page filters by date and status. The export should obviously respect the filters. "Obviously" was not in the ticket.
- ❌ Finance has a lot of payments. Exporting all of them in one request times out. It needs to be a queued job that emails a link.
- ❌ Who's allowed to export? Turns out not everyone who can see the page.
- ❌ The code review asks, reasonably, for a test.
None of this was hidden. All of it was predictable. It just wasn't visible from the stand-up, because at the stand-up we were looking at the loop.
Act III: The Reckoning
Thursday. The same stand-up. The coffee is cold. So is the room.
Product manager: How's the two-hour button?
Developer: Nearly there. Just waiting on review.
The audience nods. They have all said "nearly there". They have all been "nearly there" for a full day.
The button ships Friday. It's a good button. It handles commas, Arabic, filters, permissions and big exports. It just wasn't a two-hour button. It never was.
Curtain.
Behind the scenes: why the play always ends this way
Douglas Hofstadter summed it up decades ago: it always takes longer than you expect, even when you take into account Hofstadter's Law. A few reasons it keeps happening to smart people:
- We estimate the coding, not the work. Coding is often the smaller part. Understanding, edge cases, testing, review, deploying and checking it in production are the rest.
- Unknowns don't show up in the estimate because they're unknown. You can't add time for a problem you haven't imagined yet.
- Optimism is the default setting. We picture the version of the task where everything works first time.
- A single number sounds like a promise. "Two hours" leaves the meeting as a commitment, even if you meant "two hours if nothing weird happens".
Director's notes: how to write a better script
You can't remove uncertainty from software. You can stop hiding it.
✅ Break it down before you answer. Spend five minutes listing the pieces: UI, query, permissions, edge cases, tests, review, deploy. Estimate the pieces, not the feeling. The list itself usually exposes Act II before it happens.
✅ Give a range, not a number. "Half a day to two days, depending on how big the exports get" is more honest and more useful. It tells the listener where the risk is.
✅ Name your assumptions. "Assuming the export follows the current filters and only managers can use it." When an assumption breaks, the estimate changing is expected, not a failure.
✅ Add a buffer for the things you can't see. Not as padding to hide, but as a visible line. Everyone knows the unknowns exist.
✅ Spike the scary part. If one piece is genuinely unknown, time-box an hour to investigate it, then estimate.
✅ Compare with last time. Your memory of how long things take is optimistic. Your ticket history isn't.
If you remember one thing: when someone asks "how long?", the most valuable answer isn't a number. It's "let me list what's involved", followed by a range.
Estimates will always be a bit of theatre. But a play where everyone knows Act II is coming is a lot less stressful than one where it's a surprise every single time.
What's the most innocent-sounding "two-hour" task that ate your whole week?

Be first to comment it...